mongodb - mongodb对文档中的子文档求和
问题描述
我有一个类似于以下的 mongodb 集合:
{
'_id' : '123123123123',
'FOO' : {
'A' : 2,
'B' : 1,
'C' : 5
},
'BAR' : {
'D' : 6,
'E' : 1
}
}
我会很高兴有人向我解释如何将数字汇总到子文档中。我想得到这个结果:
{
'_id' : 'blahblah',
'FOO' : 8,
'BAR' :13
}
解决方案
您可以在 3.4 中使用以下聚合。
更新:
db.colname.aggregate({
"$replaceRoot":{
"newRoot":{
"$mergeObjects":[
{"_id":"$_id"},
{"$arrayToObject":{
"$map":{
"input":{
"$filter":{
"input":{"$objectToArray":"$$ROOT"},
"cond":{"$in":["$$this.k",["FOO","BAR"]]}
}
},
"in":{
"k":"$$this.k",
"v":{
"$sum":{
"$let":{
"vars":{
"kv":{"$objectToArray":"$$this.v"}},
"in":"$$kv.v"
}
}
}
}
}
}}
]
}
}
})
原来的:
db.colname.aggregate({
"$project":{
"FOO":{
"$sum":{
"$let":{
"vars":{"fookv":{"$objectToArray":"$FOO"}},
"in":"$$fookv.v"
}
}
},
"BAR":{
"$sum":{
"$let":{
"vars":{"barkv":{"$objectToArray":"$BAR"}},
"in":"$$barkv.v"
}
}
}
}
})
推荐阅读
- node.js - 如何为 HTML 属性设置内容安全策略
- git - 使用 Azure AD 进行单点登录的 Gitlab 身份验证和授权
- java - Java“绘画”应用程序
- php - 如何只输出唯一的分类术语?
- django - ubuntu 20 上的 django apache2 设置用于内网访问
- python - pyenv:构建失败(Fedora 34 使用 python-build 20180424)
- javascript - PWA 启动画面和主屏幕上的图标出现在 iOS 设备中,但不在 Android 中(下面的 manifest.json 文件)
- algorithm - 在图像中找到非最大抑制的有效方法?
- python - 将 Dict 附加到 DataFrame 时,我得到“TypeError:'dict' object is not callable”
- python - 如何使用 Python 在现有 eml 文件中添加 pdf 附件?