MongoDB-查询以对数组中的嵌套文档进行计数

时间:2018-07-10 21:45:33

标签: mongodb mongodb-query

MongoDB-布局

MongoDB - Layout

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

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

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

用例2:一个查询,该查询将输出Collection_1Collection_1下的每个文档的someArrayField下的元素总数。布局)。

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

因此,我们非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

给出以下测试集:

    { 
    "_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"}
            }
        },
    ]
);