如何找到总的子阵列大小(本例中为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"),
}
]
},
]
}
答案 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);
}
});