MongoDB Java驱动程序:与sort不同

使用MongoDB控制台,我可以使用不同的密钥编写本机MongoDB查询,其类似于:

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

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

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

但是,这不起作用,因为DBCollection#distinct()返回类型List而不是类型DBCursorDBCollection#find()

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

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

要在Java中执行等效操作,您可以:

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

要使用服务器端排序获取唯一键,可以使用aggregate 。 以下是你在shell中的表现:

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

但是,当我测试它时,简单的客户端排序方法表现得更好。

你实际上可以使用纯JavaScript

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

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

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

在robomongo上测试过