6

使用 MongoDB 控制台,我可以使用具有如下排序的不同键编写本机 MongoDB 查询:

db.mycollection.distinct('mykey').sort('mykey', 1)

使用 Java 驱动程序,我希望能够编写如下相同的查询:

myCollection.distinct("myKey").sort(new BasicDBObject("myKey", 1));

但是,这不起作用,因为DBCollection#distinct()返回 typeList而不是 type DBCursorlike DBCollection#find()

如何使用 Java 驱动程序编写带有排序的不同查询?

4

2 回答 2

14

MongoDB 不支持使用该distinct命令进行服务器端排序。控制台中发生的情况是distinct('myKey')调用返回一个数组,然后您sort在该数组上调用 JavaScript 方法,该方法返回数组的排序版本。您传入的参数将sort被忽略。

要在 Java 中做同样的事情,你会做:

List myKeys = myCollection.distinct("myKey");
java.util.Collections.sort(myKeys);

要使用服务器端排序获取唯一键,您可以使用aggregate. 以下是您在 shell 中执行此操作的方法:

db.mycollection.aggregate([
    { $group: {_id: '$myKey' }},
    { $sort: {_id: 1}}
])

但是,当我对此进行测试时,简单的客户端排序方法的性能要好得多。

于 2013-08-28T03:28:48.360 回答
-1

您实际上可以使用纯 javascript

db.mycollection.distinct('mykey').sort()

或传递比较函数以进行更详细的排序:

db.users.distinct('mykey').sort(function(a, b){return a >b})

在 robomongo 上测试

于 2017-01-13T10:48:55.320 回答