我的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()
函数产生的总文档数量)< / p>
有什么建议吗?感谢
答案 0 :(得分:9)
将.skip(2).limit(3)
添加到查询的末尾
答案 1 :(得分:5)
我想你的藏品中有以下文件。
{ "_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
运算符分别跳过前两个文档并将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在comment
中指出的那样
$group
将阅读所有文档,并使用它们构建一个20k元素数组,以获得三个文档。
然后,您应该使用find()
db.collection.find().skip(2).limit(3)
和
db.collection.count()