3

有没有一种首选的方式来查询带有限制的 mongo 并知道如果我用跳过/限制查询下一页是否会有更多结果?

我一直在做的是要求比我需要的多一个文档,将其从末尾切开,并使用该额外文档的存在来了解另一个查询是否会提供至少一个更多结果。

n = 10
docs = db.documents.find({'foo': 'bar'}).limit(n+1)
more = docs.count() > n
docs = docs[:n]

我觉得这是一个常见的用例(知道是否在网站上显示“更多结果”按钮),我觉得我目前的解决方案很愚蠢。

4

1 回答 1

5

MongoDB 有tailable cursors,允许您在返回所有数据后重用游标。它看起来像这样:

n = 10
docs = db.documents.find({"foo": "bar"}).limit(n)
more = docs.hasNext()

请注意,仅检索到 10 个文档,但可以检查光标以确定是否有更多可用对象。唯一的问题是可尾游标只能用于有上限的集合。

以上也可以与常规游标一起使用,但您必须查询n + 1文档。这与您现在使用的解决方案基本相同。您必须使用size(),因为这会考虑到跳过和限制修饰符。

n = 10
docs = db.documents.find({"foo": "bar"}).limit(n + 1)
more = db.size() > n

我不熟悉 PyMongo,所以我不确定这一点,但是这个解决方案有可能将n + 1完整的文档发送到您的应用程序,而不是 required n,从而导致较小的带宽开销。如果是这种情况,您可能希望创建一个执行相同操作的服务器端函数,但只返回一个包含n数组中文档的对象,以及一个指示第一个n + 1文档是否可用的标志。

于 2010-08-19T09:16:59.127 回答