2014-04-08 29 views
36

Vorrei ottenere una forma ordinata di nomi da mongodb.I aveva fatto questo attraverso il seguenteMongo DB ordinamento Con case insensitive

query.sort().on("name", Order.ASCENDING) 

con questa esecuzione di query sono stato in grado di trovare i risultati ordinati con il caso sensibile. Ma voglio solo ottenere i risultati in caso di modulo ignorato. Come farlo? Per favore guidami attraverso questo.

Sto lavorando su codice java. Quindi, per favore suggeriscimi con metodi appropriati.

+0

prega, elaborare un po 'di più la tua domanda – rpax

risposta

33

Aggiornamento: Questa risposta non è aggiornata, 3.4 avrà indici senza distinzione tra maiuscole e minuscole. Guardate al JIRA per ulteriori informazioni https://jira.mongodb.org/browse/SERVER-90


Purtroppo MongoDB non dispone ancora di casi di indici insensitive: https://jira.mongodb.org/browse/SERVER-90 e il compito è stato spinto indietro.

Questo significa che l'unico modo per ordinare la distinzione tra maiuscole e minuscole al momento è in realtà creare un campo specifico con "casing inferiore", copiando il valore (ovviamente inferiore) del campo di ordinamento in questione e ordinandolo invece.

+0

Quindi non v'è alcuna opzione per ordinare i risultati con insensibilità a meno che non si crei un nuovo campo con valori di casing inferiore o superiore. ryt ?? –

+1

@VarunKumar sì che è uno dei punti negativi di MongoDB, io personalmente non usa la risposta qui sotto, MongoDB sarà limitata a 32meg di sorta, senza essere consentito l'indice risultante in piccolissime set di risultati. – Sammaye

+1

@VarunKumar per essere più precisi ti sarà limitato tra l'ordinamento da 2 a 32.000 record a seconda della dimensione dei documenti, non solo, ma l'ordinamento sarà completamente in memoria, che sarà un killer – Sammaye

36

ordinamento funziona come quello in MongoDB, ma si può fare questo al volo con il complesso:

Prendere i seguenti dati:

{ "field" : "BBB" } 
{ "field" : "aaa" } 
{ "field" : "AAA" } 

Quindi, con la seguente dichiarazione:

db.collection.aggregate([ 
    { "$project": { 
     "field": 1, 
     "insensitive": { "$toLower": "$field" } 
    }}, 
    { "$sort": { "insensitive": 1 } } 
]) 

Produrrebbe risultati come:

L'ordine di inserimento effettivo verrebbe mantenuto per tutti i valori risultanti nella stessa chiave quando convertiti.

+0

Yup .. questo sembra gud .. ma voglio implementare lo stesso da un codice java .. Quindi sarà più utile se mi condividi come questo possa essere ottenuto da Classe Java con gestione di mongodb e oggetto query. –

+0

@VarunKumar Fondamentalmente è necessario costruire le voci DBObject passate al metodo di aggregazione. C'è [questo esempio] (http://docs.mongodb.org/ecosystem/tutorial/use-aggregation-framework-with-java-driver/) nelle risorse della documentazione. Quindi non dovrebbe essere difficile da tradurre. E considerando che è una risposta reale per mostrare come può essere fatto che non dovrebbe essere troppo difficile. –

+0

Questo sarebbe lento (cioè l'aggregato viene valutato ogni volta?) –

2

Eccolo in Java. Ho mescolato no-args e prime varianti chiave-Val di BasicDBObject solo per la varietà

 DBCollection coll = db.getCollection("foo"); 

     List<DBObject> pipe = new ArrayList<DBObject>(); 

     DBObject prjflds = new BasicDBObject(); 
     prjflds.put("field", 1); 
     prjflds.put("insensitive", new BasicDBObject("$toLower", "$field")); 

     DBObject project = new BasicDBObject(); 
     project.put("$project", prjflds); 
     pipe.add(project); 

     DBObject sort = new BasicDBObject(); 
     sort.put("$sort", new BasicDBObject("insensitive", 1)); 
     pipe.add(sort); 

     AggregationOutput agg = coll.aggregate(pipe); 

     for (DBObject result : agg.results()) { 
      System.out.println(result); 
     } 
9

Questo è stato un issue per un periodo piuttosto lungo in MongoDB JIRA, ma è risolto ora. Dai uno sguardo a this release notes for detailed documentation. Dovresti usare collation.

User.find() 
    .collation({locale: "en" }) //or whatever collation you want 
    .sort({name:'asc'}) 
    .exec(function(err, users) { 
     // use your case insensitive sorted results 
    }); 
+0

Questo non ha funzionato per me – CodeHacker

0

risolviamo questo problema con l'aiuto della funzione .Sort in array JavaScript

Ecco il codice

 

    function foo() { 
     let results = collections.find({ 
     _id: _id 
     }, { 
     fields: { 
      'username': 1, 
     } 
     }).fetch(); 

     results.sort((a, b)=>{ 
     var nameA = a.username.toUpperCase(); 
     var nameB = b.username.toUpperCase(); 

     if (nameA nameB) { 
      return 1; 
     } 
     return 0; 
     }); 

     return results; 
    }