2012-09-18 9 views
6

I Morphia Java-Treiber bin mit einem MongoDB für die Abfrage, die eine Auflistung der folgenden Form enthält:Abfrage MongoDB für geordnete verschiedene Werte

MyCollection { 
    TypeA 
    TypeB 
} 

Ich möchte alle unterschiedlichen Werte von TypeB abzurufen, die ich den folgenden Code verwenden code:

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

Der obige Code funktioniert wie erwartet, aber die Liste der verschiedenen Werte ist natürlich nicht sortiert.

Ich habe mit dem folgenden Code experimentiert:

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

Aber in diesem Fall ist die Liste leer ist, wo sind falsch meine Annahmen?

UPDATE

der CLI Durch die Verwendung fand ich heraus, dass die folgende Abfrage das erwartete Ergebnis zurück:

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

So stellte ich meinen Code entsprechend:

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

Noch führen enthält 0 Einträge!

Was macht mich wirklich verwirrt ist, dass die gleiche Abfrage funktioniert, wenn ich .find statt .distinct verwenden:

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 

Warum ist es, dass die Filter funktionieren nicht, wenn die deutlich Methoden- mit Anruf?

Antwort

5

Der zweite DBObject-Parameter von DBCollection.distinct() ist ein Abfrageobjekt, mit dem die übereinstimmenden Kriterien definiert werden. Um die Listenunterscheidungen zu sortieren, können Sie verwenden:

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

Ja, das ist eine Problemumgehung, die ich derzeit verwende. Aber ich glaubte, dass ich in der Lage sein sollte, eine Abfrage hinzuzufügen, die das Ergebnis anordnet, bevor die eindeutigen Werte abgerufen werden. – aksamit

+2

was ist, wenn Sie auf der Mongodb-Ebene sortieren möchten, falls Sie Limit machen – nightograph