2013-08-20 13 views
5

Utilizzando la console di MongoDB posso scrivere una query nativa MongoDB usando la chiave distinta con una specie del genere:conducente MongoDB Java: distinta con specie

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

Uso del driver Java mi aspetterei di essere in grado di scrivere il stessa query come questa:

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

Tuttavia, questo non funziona perché DBCollection#distinct() restituisce il tipo List e non di tipo DBCursor come DBCollection#find().

Come posso scrivere la query distinta con un ordinamento utilizzando il driver Java?

risposta

12

MongoDB non supporta l'ordinamento sul lato server con il comando distinct. Quello che succede nella console è che la chiamata restituisce un array e quindi stai chiamando il metodo JavaScript sort su quell'array che restituisce una versione ordinata dell'array. I parametri passati a sort vengono ignorati.

Per fare l'equivalente in Java si dovrebbe fare:

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

Per ottenere le chiavi uniche che utilizzano un server-side sorta si potrebbe usare aggregate. Ecco come si farebbe che nella shell:

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

Tuttavia, quando ho provato questo, l'approccio semplice tipo client-side eseguito molto meglio.

+0

Grazie, ha un senso. Suppongo che l'ordinamento sul lato client sia soddisfacente a meno che non sia necessaria la paginazione per un ampio set di risultati. (tornerà e presenterà la taglia in seguito). –

0

si può effettivamente utilizzare puro JavaScript

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

o passare una funzione di confronto per l'ordinamento più elaborato:

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

provata su robomongo

Problemi correlati