我想你的收藏中有以下文档。
{ "_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 在comment 中指出的那样
$group 将读取所有文档并使用它们构建一个 20k 元素数组,以获得三个文档。
然后您应该使用find() 运行两个查询
db.collection.find().skip(2).limit(3)
和
db.collection.count()