次の形式のコレクションを含む 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
個別のメソッド呼び出しを使用するとフィルターが機能しないのはなぜですか?