我收藏了一些文件,如:文档1:
{
"company": "ABC"
"application": {
"app-1": {"earning_from_src_A": 50,
"earning_from_src_B": 43},
"app-2": {"earning_from_src_A": 10,
"earning_from_src_B": 13}
}
} 文件2:
{
"company": "ABCD"
"application": {
"app-1": {"earning_from_src_A": 150,
"earning_from_src_B": 413},
"app-2": {"earning_from_src_A": 110,
"earning_from_src_B": 113},
"app-3": {"earning_from_src_A": 1,
"earning_from_src_B": 34},
}
} 我想得到所有的申请和收集文件。类似:结果:
{
"app-1": {"earning_from_src_A": 200,
"earning_from_src_B": 456},
"app-2": {"earning_from_src_A": 120,
"earning_from_src_B": 126},
"app-3": {"earning_from_src_A": 1,
"earning_from_src_B": 34},
}有人能帮我吗?
我试过使用聚合函数,但无法对集合进行分组。
发布于 2018-12-09 14:13:31
您可以使用下面的聚合
所以基本上你的钥匙在这里是未知的。因此,您必须使用$objectToArray聚合将它们转换为键值对。然后,您可以轻松地使用应用程序名称$group他们,并计数那里从A和B的收入。
db.collection.aggregate([
{ "$addFields": {
"application": { "$objectToArray": "$application" }
}},
{ "$unwind": "$application" },
{ "$group": {
"_id": "$application.k",
"earning_from_src_A": {
"$sum": "$application.v.earning_from_src_A"
},
"earning_from_src_B": {
"$sum": "$application.v.earning_from_src_B"
}
}},
{ "$group": {
"_id": null,
"data": {
"$push": {
"k": "$_id",
"v": {
"earning_from_src_A": "$earning_from_src_A",
"earning_from_src_B": "$earning_from_src_B"
}
}
}
}},
{ "$replaceRoot": { "newRoot": { "$arrayToObject": "$data" }}}
])哪个outputs
[
{
"app-1": {
"earning_from_src_A": 200,
"earning_from_src_B": 456
},
"app-2": {
"earning_from_src_A": 120,
"earning_from_src_B": 126
},
"app-3": {
"earning_from_src_A": 1,
"earning_from_src_B": 34
}
}
]https://stackoverflow.com/questions/53692989
复制相似问题