2014-04-08 15 views
36

chciałbym uzyskać posortowaną formy nazwisk z mongodb.I zrobił to za pomocą następującegoMongo DB sortowania Z przypadku niewrażliwych

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

z tego wykonania kwerendy udało mi się znaleźć posortowanych wyniki z przypadku wrażliwy. Ale chcę tylko uzyskać wyniki w formie ignorowanej. Jak to zrobić? Proszę, poprowadź mnie przez to.

Pracuję nad kodem Java. Proszę więc zasugeruj mi odpowiednie metody.

+0

Proszę rozwinąć trochę bardziej swoje pytanie – rpax

Odpowiedz

33

Aktualizacja: Ta odpowiedź jest nieaktualna, w indeksie 3.4 nie są uwzględniane wielkości liter. Spójrz na JIRA więcej informacji https://jira.mongodb.org/browse/SERVER-90


Niestety MongoDB nie posiada jeszcze wielkość liter ma znaczenie indeksów: https://jira.mongodb.org/browse/SERVER-90 a zadanie zostało zepchnięte.

Oznacza to, że jedynym sposobem sortowania bez rozróżniania wielkości liter jest obecnie utworzenie konkretnego pola "z małymi literami", skopiowanie wartości (oczywiście z małych liter) w polu sortowania i posortowanie na nim.

+0

więc nie ma opcji dla sortowanie wyników z niewrażliwymi, chyba że tworzy się nowe pole tylko z wartościami dolnymi lub dużymi. ryt? –

+1

@VarunKumar yep jest jednym ze złych punktów MongoDB, ja osobiście nie użyłbym poniższej odpowiedzi, MongoDB będzie ograniczony do 32meg sortowania bez indeksu, co powoduje, że bardzo małe zestawy wyników są dozwolone. – Sammaye

+1

@VarunKumar aby być bardziej precyzyjnym będziesz ograniczony do sortowania od 2 do 32 000 rekordów w zależności od rozmiaru dokumentów, nie tylko to, ale sortowanie będzie całkowicie w pamięci, co będzie zabójcą. – Sammaye

36

Sortowanie działa tak w MongoDB, ale można to zrobić w locie z kruszywa:

Take następujące dane:

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

Więc z następującym stwierdzeniem:

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

Może produkować wyniki takie jak:

{ 
    "field" : "aaa", 
    "insensitive" : "aaa" 
}, 
{ 
    "field" : "AAA", 
    "insensitive" : "aaa" 
}, 
{ 
    "field" : "BBB", 
    "insensitive" : "bbb" 
} 

Rzeczywista kolejność wstawiania zostanie zachowana dla wszystkich wartości, które będą skutkować tym samym kluczem podczas konwersji.

+0

Yup .. to wygląda gud .. ale chcę zaimplementować to samo z kodu java .. Więc będzie bardziej pomocne, jeśli podzielisz mnie, że jak można to osiągnąć z Klasa Java z obsługą mongodb i obiektem zapytania. –

+0

@VarunKumar W zasadzie musisz skonstruować wpisy DBObject, które przekazujesz do metody agregującej. Istnieje [ten przykład] (http://docs.mongodb.org/ecosystem/tutorial/use-aggregation-framework-with-java-driver/) w zasobach dokumentacji. Więc nie powinno być trudno tłumaczyć. Biorąc pod uwagę fakt, że jest to faktyczna odpowiedź, aby pokazać, jak można to zrobić, nie powinno to być zbyt trudne. –

+0

Czy byłoby to powolne (tj. Czy agregat jest oceniany za każdym razem?) –

2

Tutaj jest na Jawie. I nie mieszać-args i pierwsze warianty key-Val z BasicDBObject tylko dla odmiany

 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

Jest to na issue dłuższego czasu MongoDB JIRA, ale jest rozwiązany teraz. Spójrz na this release notes for detailed documentation. Powinieneś użyć 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

To nie działa dla mnie – CodeHacker

0

Rozwiązujemy ten problem za pomocą funkcji .sort w tablicy JavaScript

Oto kod

 

    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; 
    }