繁体   English   中英

MongoDB聚合:2个数组的总和

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM