【问题标题】:MongoDB - Query to count the nested documents in an arrayMongoDB - 查询以计算数组中的嵌套文档
【发布时间】:2018-07-10 21:45:32
【问题描述】:

MongoDB - 布局

我是 MongoDB 的新手,如果我在这里使用了错误的术语,请原谅我。

鉴于上述布局(附图),我需要提出两个查询:

用例 1: 一个查询,将输出给定文档标识符的 someArrayField 下的元素总数。 例如,对于上面的布局,我希望查询为 someArrayField 返回 2,因为它下面有 2 个元素作为嵌套文档。

用例 2: 一个查询将输出 Collection_1 下每个文档的 someArrayField 下元素总数的计数(Collection_1 可以包含多个具有相似布局的文档)。

我知道,我需要以某种方式使用“聚合管道”来获得所需的结果,但由于缺乏 NoSQL 经验,我在这里有点挣扎。

所以,非常感谢任何帮助!

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    给定以下测试集:

        { 
        "_id" : ObjectId("5b453cc7799fb211dc44a1e8"), 
        "id" : 1.0, 
        "nestedDoc" : {
            "nestedArray" : [
                {
                    "field1" : "value1", 
                    "field2" : "value2", 
                    "field3" : "value3"
                }, 
                {
                    "field1" : "value11", 
                    "field2" : "value21", 
                    "field3" : "value31"
                }, 
                {
                    "field1" : "value12", 
                    "field2" : "value22", 
                    "field3" : "value32"
                }
            ]
        }
    }
    { 
        "_id" : ObjectId("5b453d23799fb211dc44a1e9"), 
        "id" : 2.0, 
        "nestedDoc" : {
            "nestedArray" : [
                {
                    "field1" : "value1", 
                    "field2" : "value29", 
                    "field3" : "value39"
                }, 
                {
                    "field1" : "value118", 
                    "field2" : "value281", 
                    "field3" : "value381", 
                    "field4" : "value281"
                }, 
                {
                    "field1" : "value172", 
                    "field2" : "value272", 
                    "field3" : "value372"
                }
            ]
        }
    }
    

    用例 1: 运行以下聚合查询:

    db.test1.aggregate(
        [
            // Stage 1 : filter documents
            {
                $match: {
                id:1
                }
            },
            // Stage 2 : count array size and return only it.
            {
                $project: {
                    arraySize:{$size:"$nestedDoc.nestedArray"},
                    _id:0
                }
            },
        ]
    );
    

    **用例 2 ** 运行以下命令:

    db.test1.aggregate(
        [
            // Stage 1 count array size for each document
            {
                $project: {
                    _id:0,
                    arraySize:{$size:"$nestedDoc.nestedArray"}
                }
            },
            // Stage 2 group all documents and sum arraySize
            {
                $group: {
                _id:null,
                totalArraysSize:{$sum:"$arraySize"}
                }
            },
        ]
    );
    

    【讨论】:

    • 完美! - 这就是我正在寻找的 usecase_1。但是,我试图调整您的 usecase_2 解决方案以获取每个文档的计数,但无法成功。
    • 好的,我误解了用例 2。如果您需要每个文档的数组大小,只需删除小组阶段。
    猜你喜欢
    • 2019-10-09
    • 2018-03-09
    • 1970-01-01
    • 2019-02-20
    • 2021-02-25
    • 2016-08-16
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多