我的mongodb中有20,000多个文档.我刚刚得知你不能一次性查询它们.
所以我的问题是:
我想使用我的文档,find(query)
然后仅限制3个文档的结果,我可以选择这些文档的起源.
例如,如果我的find()
查询导致了8个文档:
[{doc1}, {doc2}, {doc3}, {doc4}, {doc5}, {doc6}, {doc7}, {doc 8}]
命令limit(2, 3)
会给出[doc3, doc4, doc5]
而且我还需要得到所有结果的总计数(没有限制),例如:length()
将给出8
(由find()
函数产生的总文档数)
有什么建议吗?谢谢
添加.skip(2).limit(3)
到查询的末尾
我想你的收藏中有以下文件.
{ "_id" : ObjectId("56801243fb940e32f3221bc2"), "a" : 0 } { "_id" : ObjectId("56801243fb940e32f3221bc3"), "a" : 1 } { "_id" : ObjectId("56801243fb940e32f3221bc4"), "a" : 2 } { "_id" : ObjectId("56801243fb940e32f3221bc5"), "a" : 3 } { "_id" : ObjectId("56801243fb940e32f3221bc6"), "a" : 4 } { "_id" : ObjectId("56801243fb940e32f3221bc7"), "a" : 5 } { "_id" : ObjectId("56801243fb940e32f3221bc8"), "a" : 6 } { "_id" : ObjectId("56801243fb940e32f3221bc9"), "a" : 7 }
从MongoDB 3.2您可以使用.aggregate()
方法和$slice
运算符.
db.collection.aggregate([ { "$group": { "_id": null, "count": { "$sum": 1 }, "docs": { "$push": "$$ROOT" } }}, { "$project": { "count": 1, "_id": 0, "docs": { "$slice": [ "$docs", 2, 3 ] } }} ])
哪个回报:
{ "count" : 8, "docs" : [ { "_id" : ObjectId("56801243fb940e32f3221bc4"), "a" : 2 }, { "_id" : ObjectId("56801243fb940e32f3221bc5"), "a" : 3 }, { "_id" : ObjectId("56801243fb940e32f3221bc6"), "a" : 4 } ] }
您可能希望在使用$sort
运算符进行分组之前对文档进行排序.
从MongoDB 3.0开始,您需要首先获取$group
文档并使用$sum
累加器运算符返回文档的"计数"; 同样在同一组阶段,您需要使用$push
和$$ROOT
变量返回所有文档的数组.然后,管道中的下一个阶段将是$unwind
您对该数组进行非规范化的阶段.从那里使用使用$skip
和$limit
运算符分别跳过前2个文档并将3个文档传递到下一个阶段,这是另一个$group
阶段.
db.collection.aggregate([ { "$group": { "_id": null, "count": { "$sum": 1 }, "docs": { "$push": "$$ROOT" } }}, { "$unwind": "$docs" }, { "$skip": 2 }, { "$limit": 3 }, { "$group": { "_id": "$_id", "count": { "$first": "$count" }, "docs": { "$push": "$docs" } }} ])
正如@JohnnyHK在这篇评论中指出的那样
$group
将要阅读所有文档并使用它们构建一个20k元素数组,以获得三个文档.
然后,您应该使用运行两个查询 find()
db.collection.find().skip(2).limit(3)
和
db.collection.count()