我知道已经有一些使用 mongo 进行分页的模式(在少数文档上跳过(),在许多文档上进行范围查询),但在我的情况下,我需要实时排序。
更新:
为了清楚起见,我将改变问题点。我可以进行这样的查询吗:
db.collection.find().sort({key: 1}).limit(n).sort({key: -1}).limit(1)
重点是按"通常"顺序对查询进行排序,限制返回的数据集,然后通过排序来反转它以获取分页数据的最后一个索引。我尝试了这种方法,但似乎 mongo 以某种方式优化了查询并忽略了第一个 sort() 运算符。
我在尝试掌握您的问题时遇到了很大的问题。
据我所知,当用户刷新页面时,比如 6 小时后,它不仅应该显示那里的结果,还应该显示现在的结果。
正如@JohnnyHK所说,MongoDB自然地进行"实时"排序,因此MongoDB就是这种情况,因为您的查询会给您正确的结果。
现在我认为您可能试图在这里解决的一个问题(这个问题需要大量澄清)是,由于数据更改,您看到的最后_id
可能不再真正代表页码等,甚至不再代表信息的多样性,即您看到的最后_id
现在实际上是第 13 页的一半。
这些事情你可能会花费更多的时间和性能来解决,而不仅仅是让用户明白他们已经 AFAK 很长时间了。
编辑
啊哈,我想我明白你现在想做什么,你试图通过同时获取页面和列表中的最后一项来偷偷摸摸。不幸的是,就像SQL一样,这是不可能的。即使排序像这样工作,排序也不会像它应该的那样起作用,因为您只能在单个字段上以一种方式排序。
但是,为了将来的参考,sort()
函数正是游标上的函数,直到您通过开始迭代它来实际打开游标,多次调用sort()
只会覆盖 cursor 属性。
恐怕这必须通过两个查询来完成,所以你先得到你的页面,然后客户端(我认为你在寻找该页面的最大值)滚动记录以查找最后一个_id
或者只是做第二个查询来获取最后一个_id
。它应该是超级杜帕快。