我可能遗漏了一些东西,因为我还在学习MongoDB的细节,但我需要帮助来分页一个集合。
我有一个集合,里面有一个名字列表。
底部一轮牛肉
鸡胸肉6盎司
鸡胸肉8盎司
鸡胸肉8盎司
鸡胸肉8盎司
随机鸡胸肉
鸡腿
鸡里脊肉
鸡大腿
洁食食盐
我在"ProductName,_id“上创建了一个复合索引。
我运行这个查询:
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盎司,并从那里开始。
有什么办法可以解决这个问题吗?
另外,如果列表以相反的方式排序,我该如何做呢?
发布于 2011-04-03 09:12:27
因为我正在分页的集合有重复的值,所以我必须在ProductName和id上创建一个复合索引。
创建复合索引
db.ProductGuideItem.ensureIndex({ ProductName:1, _id:1});这解决了我的问题。
参考:https://groups.google.com/d/msg/mongodb-user/3EZZIRJzW_A/oYH79npKZHkJ
假设您具有以下值:
{a:1, b:1}
{a:2, b:1}
{a:2, b:2}
{a:2, b:3}
{a:3, b:1}因此,您可以对基于范围的分页(页面大小为2)执行此操作:
第一页
find().sort({a:1, b:1}).limit(2)
{a:1, b:1}
{a:2, b:1}第2页
find().min({a:2, b:1}).sort({a:1, b:1}).skip(1).limit(2)
{a:2, b:2}
{a:2, b:3}第3页
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。
发布于 2013-08-26 00:06:22
你只需要在游标上调用跳过
请参阅cursor skip上的MongoDB文档“此方法在实现”分页“结果时可能很有用”。
此示例取自Mongodb的example
function printStudents(pageNumber, nPerPage) {
print("Page: " + pageNumber);
db.students.find().skip((pageNumber-1)*nPerPage).limit(nPerPage).forEach( function(student) { print(student.name + "<p>"); } );
}https://stackoverflow.com/questions/5525304
复制相似问题