MongoDB为每个文档的每个列表获取不同的总和

MongoDB为每个文档的每个列表获取不同的总和,mongodb,Mongodb,我收藏了这些文件 { id:1, small:[{k:'A',v:1},{k:'B',v:2},{k:'D',v:3}], big:[{k:'A',v:2},{k:'B',v:3},{k:'C',v:1},{k:'D',v:4}] }, { id:2, small:[{k:'A',v:1},{k:'B',v:2},{k:'D',v:3}], big:[{k:'A',v:2},{k:'B',v:3},{k:'C',v:1},{k:'D',v:4}]

我收藏了这些文件

{
    id:1,
    small:[{k:'A',v:1},{k:'B',v:2},{k:'D',v:3}],
    big:[{k:'A',v:2},{k:'B',v:3},{k:'C',v:1},{k:'D',v:4}]
},
{
    id:2,
    small:[{k:'A',v:1},{k:'B',v:2},{k:'D',v:3}],
    big:[{k:'A',v:2},{k:'B',v:3},{k:'C',v:1},{k:'D',v:4}]
},
{
    id:3,
    small:[{k:'A',v:1},{k:'B',v:2},{k:'D',v:3}],
    big:[{k:'A',v:2},{k:'B',v:3},{k:'C',v:1},{k:'D',v:4}]
}
现在,我想得到两个列表中每个键的总和。我希望我的输出如下所示:

{k:'A',small:3, big:6},
{k:'B',small:6, big:9},
{k:'D',small:9, big:12}
请注意,输出不包含键“C”。这是因为我只想输出“小”列表中存在的键。mongodb的功能是什么 我应该用这个吗

谢谢

试试下面的聚合:

db.col.aggregate([
    { $unwind: "$small" },
    { $unwind: "$big" },
    { $redact: {
        $cond: {
           if: { $eq: [ "$small.k", "$big.k" ] },
           then: "$$KEEP",
           else: "$$PRUNE"
         }
       }
     },
     { 
        $group: { _id: "$small.k", small: { $sum: "$small.v" }, big: { $sum: "$big.v" } }
     },
     {
        $sort: { "_id": 1 }
     }
])
一般来说,每个文档中只需要一个
small
big
(这就是为什么double$unwind)。然后,我们希望只保留密钥相等的文档。这是过滤掉
C
的时刻-在
small
中没有对,我们正在利用它。聚合只是一个$sum的$group