2013-08-20 8 views
5

die MongoDB-Konsole ich eine native MongoDB Abfrage mit deutlichem Tasten mit einer Art so schreiben kann:MongoDB Java-Treiber: deutliche mit Art

db.mycollection.distinct('mykey').sort('mykey', 1) 

Mit den Java-Treiber ich erwarten zu können, würde das schreiben gleiche Abfrage wie folgt:

myCollection.distinct("myKey").sort(new BasicDBObject("myKey", 1)); 

Allerdings bedeutet dies nicht, weil DBCollection#distinct() kehrt List geben und nicht DBCursor wie DBCollection#find() geben.

Wie kann ich die eindeutige Abfrage mit einer Sortierung mithilfe des Java-Treibers schreiben?

Antwort

12

MongoDB unterstützt keine serverseitige Sortierung mit dem Befehl distinct. In der Konsole geschieht Folgendes: Der Aufruf distinct('myKey') gibt ein Array zurück und Sie rufen dann die JavaScript-Methode sort für dieses Array auf, die eine sortierte Version des Arrays zurückgibt. Die Parameter, die Sie an sort übergeben, werden ignoriert.

das Äquivalent in Java zu tun was Sie tun würden:

List myKeys = myCollection.distinct("myKey"); 
java.util.Collections.sort(myKeys); 

Um die eindeutige Schlüssel mit einer serverseitigen Art könnten Sie aggregate verwenden. Hier ist, wie Sie, dass in der Schale tun würden:

db.mycollection.aggregate([ 
    { $group: {_id: '$myKey' }}, 
    { $sort: {_id: 1}} 
]) 

Allerdings, wenn ich diese getestet, der einfache clientseitige Art Ansatz viel besser durchgeführt.

+0

Danke, macht Sinn. Ich denke, die Sortierung auf der Client-Seite ist in Ordnung, wenn die Paginierung für eine große Anzahl von Ergebnissen nicht benötigt wird. (kommt zurück und reicht das Kopfgeld später ein). –

0

Sie können tatsächlich reine Javascript verwenden

db.mycollection.distinct('mykey').sort() 

oder eine Funktion für mehr vergleichen passieren Erarbeitet Sortierung:

db.users.distinct('mykey').sort(function(a, b){return a >b}) 

auf robomongo

Getestet