查找数组中子阵列的总大小

时间:2015-01-07 20:50:48

标签: mongodb

如何找到总的子阵列大小(本例中为5)?

{
    "_id" : ObjectId("54983c4c78c824eb0ac7a0cb")
    "modules" : [ 
        {
            "title" : "Store CM",
            "_id" : ObjectId("54983c4c78c824eb0ac7a0d6"),
            "documents" : [ 
               {
                    "_id" : ObjectId("54983c4c78c824eb0ac7a0ce"),
                },
                {
                    "_id" : ObjectId("54983c4c78c824eb0ac7a0cc"),
                }
            ]
        }, 
        {
            "title" : "Store CM 2",
            "_id" : ObjectId("54983c4c78c824eb0ac7a0d6"),
            "documents" : [ 
               {
                    "_id" : ObjectId("54983c4c78c824eb0ac7a0ct"),
                },
                               {
                    "_id" : ObjectId("54983c4c78c824eb0ac7a0c1"),
                },
                               {
                    "_id" : ObjectId("54983c4c78c824eb0ac7a0c7"),
                }
            ]
        },  
    ]
}

3 个答案:

答案 0 :(得分:1)

此函数应遍历对象中的所有数组,并返回对象中的数组总量。

db.runCommand( {
  eval: function countArrays(object){ 

   var totalLength = 0;
   var arr = Object.keys(object);
   for(var i = 0; i < arr.length; i++){
        if(object[arr[i]] instanceof Array){
            totalLength += countArrays(object[arr[i]]);

        }
        else if (object[arr[i]] instanceof Object)
        {
            totalLength += countArrays(object[arr[i]]);
        }
   }
   return totalLength;
}

args: [ reference to db-object]
}
);

MongoDB允许通过eval运行Javascript函数。如果将object.modules作为参数提供给函数,则此函数应返回5。

答案 1 :(得分:0)

您可以在聚合管道中使用$size运算符来获取数组字段的大小,这样您就可以获得每个文档的documents元素总数,如下所示:

db.test.aggregate([
    // Duplicate the docs, one per modules array element
    {$unwind: '$modules'},
    // Regroup on _id, summing up the size of each doc's documents array
    {$group: {
        _id: '$_id',
        totalsize: {$sum: {$size: '$modules.documents'}}
    }}
])

输出:

[ 
    {
        "_id" : ObjectId("54983c4c78c824eb0ac7a0cb"),
        "totalsize" : 5
    }
]

答案 2 :(得分:0)

Model.aggregate([
    { $match: { _id: new ObjectId('54983c4c78c824eb0ac7a0cb') }},
    { $unwind: '$modules' },
    { $group: {
        _id: '$_id',
        modulesLength: { $sum: 1 },
        documentsLength: {$sum: {$size: '$modules.documents'}}
    }}
]).exec(function(error, result) {
    if (error) {
        console.log(error);
    } else {
        console.log(result);
    }
});