java mongodb sort()和limit()函数

java mongodb sort()和limit()函数,java,mongodb,sorting,Java,Mongodb,Sorting,我想对每个JSP页面的返回结果进行排序(每页100项),而不是全局排序 DBObject sort = new BasicDBObject(); DBObject exist = new BasicDBObject(); DBObject query= new BasicDBObject(); exist.put("$exists",1); query.put("sortKey":exist);//sortKey is not indexed sort.put

我想对每个JSP页面的返回结果进行排序(每页100项),而不是全局排序

   DBObject sort = new BasicDBObject();
   DBObject exist = new BasicDBObject();
   DBObject query= new BasicDBObject();
   exist.put("$exists",1);
   query.put("sortKey":exist);//sortKey is not indexed
   sort.put("sortKey",1);
    DBCursor cursor = dbcollection.find(query).limit(100).sort(sort);
    while(cursor.hasNext()){
    System.out.println(cursor.next());
    }

但事实上,对集合中的所有文档仍然进行排序,也就是说,尽管我使用了函数limit(100),但这是一种全局排序。由于集合非常大,排序函数将花费相当长的时间。因此,我想知道mongodb java驱动程序是否具有执行局部排序的功能(仅对返回的100个文档进行排序)而不是全局排序?

在Java驱动程序中无法进行本地排序。如果需要本地排序,请将文档读入数组并对数组进行排序。

通过使用Mongodb 3.x和相应的Java驱动程序,您可以通过执行以下操作进行排序:

List<Document> list = collection.find().sort(descending("number")).into(new ArrayList<Document>());
List List=collection.find().sort(降序(“数字”)).into(新ArrayList());
用法排序为: 排序(顺序(“字段”))


顺序=升序或降序

是否确实要在本地对文档进行排序?如果没有定义的排序顺序,
limit()
查询中的结果将是不可预测的。使用将使那些服务器端查询与
limit()一起高效运行
并通过
sortKey
为您提供可预测的排序。您所说的“没有定义的排序顺序,limit()查询中的结果将不可预测”是什么意思?如果数据都是静态数据,那么每次使用query().skip().limit()时,返回的结果可能不同?假设此集合上存在活动的插入/更新/删除,则在重新定位文档(由于文档增长)或重用从已删除文档中释放的空间时,连续查询之间的结果可能不同。如果在客户端排序,则将返回下一页可能有一些项目没有按照用户期望的逻辑顺序显示。由于您将其用于分页,您的用户可能需要更可预测的内容。例如,在服务器端按
sortKey
排序,因此顺序总是升序以匹配分页。是的,我知道。但在我的JSP页面中,用户并不关心结果的可预测性,我应该做的只是为每个页面提供一个排序结果,以使页面看起来漂亮。我的问题是,对于静态mongodb数据库,“如果没有定义的排序顺序,limit()查询中的结果将不可预测”是对的?如果不使用服务器端排序,假设您得到100个文档(第1页)来自集合。它们没有任何特定的顺序,但您可以在客户端对它们进行排序。现在获取接下来的100个文档(第2页),并在客户端上对其进行排序。第2页中可能有用户根据排序键在第1页上期望的结果。如果数据不变,则结果可能是一致的,但从最终用户的角度来看,结果可能是不可预测/预期的。前100个文档是找到的前100个文档;后100个文档是下一个找到100。也许这不会影响你的使用?