8

我正在使用 Morphia Java 驱动程序来查询包含以下形式的集合的 MongoDB:

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 个条目!

真正让我感到困惑的是,如果我使用 .find 而不是 .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

为什么使用distinct方法调用时过滤器不起作用?

4

1 回答 1

5

DBCollection.distinct() 的第二个 DBObject 参数是一个查询对象,用于定义匹配条件。要对列表进行排序,您可以使用:

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