我在我的收藏中有这些文件
{
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的功能 我应该用它吗?
谢谢!
答案 0 :(得分:1)
尝试以下聚合:
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
(这就是为什么要双倍展开)。然后我们只想保留密钥相等的文档。那是C
被过滤掉的时刻 - small
中没有对,我们正在利用$redact。聚合只是一个$ sum的$ group。