2012-09-18 6 views
6

Sto usando il driver Morphia Java per interrogare un MongoDB che contiene una raccolta di forma seguente:Query MongoDB per i valori distinti ordinate

MyCollection { 
    TypeA 
    TypeB 
} 

voglio recuperare tutti i valori distinti di TypeB che io con la seguente codice:

DBCollection myCol = getDatastore().getCollection(MyCollection.class); 
List typeBs = myCol.distinct("TypeB"); 

Sopra il codice funziona come previsto, ma l'elenco di valori distinti non è ovviamente ordinato.

ho sperimentato con il seguente codice:

DBCollection myCol = getDatastore().getCollection(MyCollection.class); 
DBObject orderBy = new BasicDBObject("$orderby", new BasicDBObject("TypeB", 1); 
List typeBs = myCol.distinct("TypeB", orderBy); 

Ma in questo caso l'elenco è vuoto, dove sono le mie supposizioni che non va?

UPDATE

Usando il CLI ho scoperto che la seguente query restituito il risultato atteso:

> db.mycollection.find({$query : {}, $orderby : { TypeB : 1 }}) 

Così ho regolato il mio codice di conseguenza:

DBCollection myCol = getDatastore().getCollection(MyCollection.class); 

BasicDBObject ascending = new BasicDBObject("TypeB", 1); 
BasicDBObject filter = new BasicDBObject(); 
filter.put("$query", new BasicDBObject()); 
filter.put("$orderby", ascending); 

List typeBs = myCol.distinct("TypeB", filter); 

Ancora risultati contiene 0 inserimenti!

Ciò che rende veramente mi confuso è che la stessa query funziona se uso .find invece di .distinct:

DBCollection myCol = getDatastore().getCollection(MyCollection.class); 

BasicDBObject ascending = new BasicDBObject("TypeB", 1); 
BasicDBObject filter = new BasicDBObject(); 
filter.put("$query", new BasicDBObject()); 
filter.put("$orderby", ascending); 

myCol.find(filter).hasNext(); <-- Evaluates to TRUE 

Perché è che il filtro non funziona quando si utilizza il metodo-distinta chiamata?

risposta

5

il secondo parametro DBObject di DBCollection.distinct() è un oggetto query, utilizzato per definire i criteri di corrispondenza. Per ordinare le distinzioni elenco è possibile utilizzare:

List typeBs = myCol.distinct("TypeB"); 
java.util.Collections.sort(typeBs); 
+2

Sì, questa è una soluzione che sto attualmente utilizzando. Ma credevo di dover aggiungere una query che ordini il risultato prima di raccogliere i valori distinti. – aksamit

+2

cosa succede se vuoi ordinare a livello di mongodb, nel caso tu stia limitando – nightograph