查询MongoDB以获取有序的不同值

aks*_*mit 8 java database mongodb nosql morphia

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

MyCollection {
   TypeA
   TypeB
}
Run Code Online (Sandbox Code Playgroud)

我想使用以下代码检索TypeB的所有不同值:

DBCollection myCol = getDatastore().getCollection(MyCollection.class);
List typeBs = myCol.distinct("TypeB");
Run Code Online (Sandbox Code Playgroud)

上面的代码按预期工作,但不同值列表当然没有排序.

我已经尝试了以下代码:

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

但在这种情况下,列表是空的,我的假设在哪里错了?

UPDATE

通过使用CLI我发现以下查询返回了预期的结果:

> db.mycollection.find({$query : {}, $orderby : { TypeB : 1 }})
Run Code Online (Sandbox Code Playgroud)

所以我相应调整了我的代码:

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);
Run Code Online (Sandbox Code Playgroud)

仍然结果包含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
Run Code Online (Sandbox Code Playgroud)

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

小智 5

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

List typeBs = myCol.distinct("TypeB");
java.util.Collections.sort(typeBs);
Run Code Online (Sandbox Code Playgroud)

  • 如果你想在mongodb级别排序,如果你正在做限制,该怎么办? (4认同)
  • 是的,这是我目前正在使用的解决方法.但我相信我应该能够在获取不同的值之前添加一个查询结果的查询. (2认同)