8

次の形式のコレクションを含む MongoDB を照会するために、Morphia Java ドライバーを使用しています。

MyCollection {
   TypeA
   TypeB
}

次のコードを使用して、TypeB のすべての個別の値を取得したいと考えています。

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

上記のコードは期待どおりに機能しますが、個別の値のリストはもちろんソートされていません。

次のコードを試しました。

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

しかし、この場合、リストは空です。私の仮定はどこが間違っていますか?

アップデート

CLI を使用して、次のクエリが期待どおりの結果を返すことがわかりました。

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

したがって、それに応じてコードを調整しました。

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

まだ結果には 0 エントリが含まれています!

本当に混乱するのは、.distinct の代わりに .find を使用すると同じクエリが機能することです。

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

個別のメソッド呼び出しを使用するとフィルターが機能しないのはなぜですか?

4

1 に答える 1

5

DBCollection.distinct() の 2 番目の DBObject パラメータはクエリ オブジェクトで、一致基準を定義するために使用されます。リストの重複をソートするには、次を使用できます。

List typeBs = myCol.distinct("TypeB");
java.util.Collections.sort(typeBs);
于 2012-09-18T17:02:02.737 に答える