我想你的收藏中应该有以下文件。
{ "_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()