MongoDB, sort() and pagination



我知道已经有一些使用 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。它应该是超级杜帕快。

最新更新