当前位置:  开发笔记 > 编程语言 > 正文

在MongoDB中限制查询结果

如何解决《在MongoDB中限制查询结果》经验,为你挑选了2个好方法。

我的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()函数产生的总文档数)

有什么建议吗?谢谢



1> Martins Unta..:

添加.skip(2).limit(3)到查询的末尾


那么,你应该首先在问题中说明.我想我完全回答了你的要求.回答关于如何跳过和限制在mongo中查找查询的问题以及聚合管道的描述将是一个过度杀伤力.

2> styvane..:

我想你的收藏中有以下文件.

{ "_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()


好主意,但是`$ group`将会读取所有文档,并使用它们构建一个20k元素数组,以获得三个文档.很难相信这比两个查询更有效.
推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有