【发布时间】:2020-09-27 03:00:31
【问题描述】:
我正在尝试通过 mongodb.collection.aggregate() 命令合并一些复杂的文档。
假设我要合并集合的文档的 x(在以下示例中:x=2):
[
{
"_id": 1,
"Data": {
"children": {
"1": {
"name": "appear_only_in_first_doc",
"cost": 1,
"revenue": 4.5,
"grandchildren": {
"1t9dsqdqdvoj8pdppxjk": {
"cost": 0,
"revenue": 1.5
}
}
},
"2": {
"name": "appear_in_both_docs",
"cost": 2,
"revenue": 7,
"grandchildren": {
"jesrdt5qwef2222dgt": {
"cost": 1,
"revenue": 3
},
"klh352hk5367kf": {
"cost": 2,
"revenue": 7
}
}
}
}
}
},
{
"_id": 2,
"Data": {
"children": {
"2": {
"name": "appear_in_both_docs___but_diff_name",
"cost": 9,
"revenue": 7,
"grandchildren": {
"aaaaaaaaa": {
"cost": 3,
"revenue": 2
},
"jesrdt5qwef2222dgt": {
"cost": 6,
"revenue": 5
}
}
},
"3": {
"name": "appear_only_in_last_doc",
"cost": 4,
"revenue": 2,
"grandchildren": {
"cccccccccccc": {
"cost": 4,
"revenue": 2
}
}
}
}
}
}
]
挑战:
- “children”和“grandchildren”键下的键是动态的,在编写查询时是未知的。
- 如果子或孙子只出现在一个文档中(例如“1”、“3”、“1t9dsqdqdvoj8pdppxjk”、“klh352hk5367kf”、“aaaaaaaa”和“cccccccccccc”) - 它也应该出现在最终结果中。
- 如果一个孩子出现在多个文档中(例如“2”和“jesrdt5qwef2222dgt”),它应该在最终结果中显示为一个。字段“成本”和“收入”应相加,最后一个“名称”字段应取。
我见过以下解决方案:
- unionWith - 不相关,联合 2 个不同的集合。
- merge - 不相关,不能对多次出现的字段值求和(取而代之的是最后一次)。
- mergeObjects - 不相关,不能对多次出现的字段值求和(取而代之的是最后一次)。
最终的结果应该是这样的:
{
"Data": {
"children": {
"1": {
"name": "appear_only_in_first_doc",
"cost": 1,
"revenue": 4.5,
"grandchildren": {
"1t9dsqdqdvoj8pdppxjk": {
"cost": 0,
"revenue": 1.5
}
}
},
"2": {
"name": "appear_in_both_docs___but_diff_name",
"cost": 11,
"revenue": 14,
"grandchildren": {
"aaaaaaaaa": {
"cost": 3,
"revenue": 2
},
"jesrdt5qwef2222dgt": {
"cost": 7,
"revenue": 8
},
"klh352hk5367kf": {
"cost": 2,
"revenue": 7
}
}
},
"3": {
"name": "appear_only_in_last_doc",
"cost": 4,
"revenue": 2,
"grandchildren": {
"cccccccccccc": {
"cost": 4,
"revenue": 2
}
}
}
}
}
}
【问题讨论】:
标签: javascript mongodb aggregate