首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MongoDB中使用范围查询进行分页?

如何在MongoDB中使用范围查询进行分页?
EN

Stack Overflow用户
提问于 2011-04-03 03:17:08
回答 2查看 55K关注 0票数 26

我可能遗漏了一些东西,因为我还在学习MongoDB的细节,但我需要帮助来分页一个集合。

我有一个集合,里面有一个名字列表。

底部一轮牛肉

鸡胸肉6盎司

鸡胸肉8盎司

鸡胸肉8盎司

鸡胸肉8盎司

随机鸡胸肉

鸡腿

鸡里脊肉

鸡大腿

洁食食盐

我在"ProductName,_id“上创建了一个复合索引。

我运行这个查询:

代码语言:javascript
复制
db.ProductGuideItem.find( { ProductName: { $gt: "Chicken Breast 8oz" } } ).sort({ProductName:1,_id:1}).limit(3); 

请注意,有3个“鸡胸8盎司”的项目。

如果我运行这个查询,我会得到...

随机鸡胸肉

鸡腿

鸡里脊肉

如果我是从顶部开始寻呼的话。查询可能会遗漏另外2个"Chicken 8 8oz“。

因此,如果每页只能有3个项目,而我想看第2页,那么我应该看到..

鸡胸肉8盎司

鸡胸肉8盎司

随机鸡胸肉。

但我不是。这将是最后一个鸡胸8盎司,并从那里开始。

有什么办法可以解决这个问题吗?

另外,如果列表以相反的方式排序,我该如何做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-03 09:12:27

因为我正在分页的集合有重复的值,所以我必须在ProductName和id上创建一个复合索引。

创建复合索引

代码语言:javascript
复制
db.ProductGuideItem.ensureIndex({ ProductName:1, _id:1});

这解决了我的问题。

参考:https://groups.google.com/d/msg/mongodb-user/3EZZIRJzW_A/oYH79npKZHkJ

假设您具有以下值:

代码语言:javascript
复制
{a:1, b:1}
{a:2, b:1}
{a:2, b:2}
{a:2, b:3}
{a:3, b:1}

因此,您可以对基于范围的分页(页面大小为2)执行此操作:

第一页

代码语言:javascript
复制
find().sort({a:1, b:1}).limit(2)
{a:1, b:1}
{a:2, b:1}

第2页

代码语言:javascript
复制
find().min({a:2, b:1}).sort({a:1, b:1}).skip(1).limit(2)

{a:2, b:2}
{a:2, b:3}

第3页

代码语言:javascript
复制
find().min({a:2, b:3}).sort({a:1, b:1}).skip(1).limit(2)
{a:3, b:1}

以下是$min/max的文档:http://www.mongodb.org/display/DOCS/min+and+max+Query+Specifiers

如果您的集合中没有重复的值,则不需要使用min & max或创建复合索引。您可以只使用$lt & $gt。

票数 34
EN

Stack Overflow用户

发布于 2013-08-26 00:06:22

你只需要在游标上调用跳过

请参阅cursor skip上的MongoDB文档“此方法在实现”分页“结果时可能很有用”。

此示例取自Mongodb的example

代码语言:javascript
复制
function printStudents(pageNumber, nPerPage) {
   print("Page: " + pageNumber);
   db.students.find().skip((pageNumber-1)*nPerPage).limit(nPerPage).forEach( function(student) { print(student.name + "<p>"); } );
}
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5525304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档