在MongoDB中限制查询结果

时间:2015-12-27 16:00:59

标签: mongodb mongodb-query aggregation-framework

我的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>

有什么建议吗?感谢

2 个答案:

答案 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()