[英]MongoDB Aggregation: summation of 2 arrays
我想通过MongoDB中的聚合管道对2个数组求和。
我的资料:
{ "_id": "1", "Type": "A", "Data": [ [ 0, 1, 0 ] , [ 0, 1, 0 ], [ 2, 0, 0 ] ] }
{ "_id": "2", "Type": "A", "Data": [ [ 2, 1, 0 ] , [ 0, 6, 0 ], [ 3, 0, 0 ] ] }
{ "_id": "3", "Type": "B", "Data": [ [ 0, 1, 0 ] , [ 0, 2, 0 ], [ 0, 0, 0 ] ] }
我想在数组的每个元素上建立和
0 1 0 2 1 0 2 2 0
0 1 0 + 0 6 0 = 0 7 0
2 0 0 0 0 0 2 0 0
所以我的结果应该像这样:
{ "_id": {"Type" : "A"}, "Data": [ [ 2, 2, 0 ] , [ 0, 7, 0 ], [ 2, 0, 0 ] ] }
{ "_id": {"Type" : "B"}, "Data": [ [ 0, 1, 0 ] , [ 0, 2, 0 ], [ 0, 0, 0 ] ] }
我从元素分组和构建$ sum开始:
[{"$group":
{ "_id": { "Type" : "$Type" },
"Data": {"$sum" : "$Data"}
}
}]
这适用于像int这样的单值数据,但不适用于数组。 那么,我该怎么做呢? (我真的希望有一个没有for循环的解决方案)
您可以展开包含索引的数组,然后对索引求和。
我想出了这个解决方案,但如果您有很多文件,我认为性能很糟糕:
db.test.aggregate([
{$match: {}},
{$unwind: {path: '$Data', includeArrayIndex: 'l1'}},
{$unwind: {path: '$Data', includeArrayIndex: 'l2'}},
{$group: {_id: {type: '$Type', l1: '$l1', l2: '$l2'}, val: {$sum: '$Data'}}},
{$sort: {'_id.type': 1, '_id.l1': 1, '_id.l2': 1}},
{$group: {_id: {type: '$_id.type', l1: '$_id.l1'}, l2: {$push: '$val'}}},
{$sort: {'_id.type': 1, '_id.l1': 1}},
{$group: {_id: '$_id.type', final: {$push: '$l2'}}},
{$sort: {_id: 1}}
])
输出为:
{ "_id" : "A", "Data" : [ [ 2.0, 2.0, 0.0 ], [ 0.0, 7.0, 0.0 ], [ 5.0, 0.0, 0.0 ] ] }
{ "_id" : "B", "Data" : [ [ 0.0, 1.0, 0.0 ], [ 0.0, 2.0, 0.0 ], [ 0.0, 0.0, 0.0 ] ] }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.