如何在MongoDB中对未知键的文档字段执行求和聚合?
MongoDB动态键Token计数求和方案
完全可以实现,不需要提前知晓count对象里的键名,用MongoDB的聚合管道就能搞定,具体步骤如下:
聚合步骤拆解
- 把count对象转成键值对数组
用$objectToArray操作符将每个文档的count对象转换成[{k: 键名, v: 计数值}]格式的数组,方便后续处理。
{ $project: { countArray: { $objectToArray: "$count" } } }
- 展开数组元素
用$unwind把数组里的每个键值对拆成独立文档,这样每个token的计数都变成单独的一条数据。
{ $unwind: "$countArray" }
- 按token键名分组求和
以token的键名为分组依据,对所有文档中该token的计数值求和。
{ $group: { _id: "$countArray.k", total: { $sum: "$countArray.v" } } }
- 合并成键值对数组
把上一步得到的每个token的求和结果重新合并成一个数组,每个元素保持{k: 键名, v: 总计数}的结构。
{ $group: { _id: null, countArray: { $push: { k: "$_id", v: "$total" } } } }
- 转回目标对象格式
用$arrayToObject把数组重新转换成count对象,同时去掉多余的_id字段。
{ $project: { _id: 0, count: { $arrayToObject: "$countArray" } } }
完整聚合命令
db.collection.aggregate([ { $project: { countArray: { $objectToArray: "$count" } } }, { $unwind: "$countArray" }, { $group: { _id: "$countArray.k", total: { $sum: "$countArray.v" } } }, { $group: { _id: null, countArray: { $push: { k: "$_id", v: "$total" } } } }, { $project: { _id: 0, count: { $arrayToObject: "$countArray" } } } ])
执行后就能得到你想要的结果:
{ "count": { "a": 5, "b": 5, "c": 9, "d": 6 } }
内容的提问来源于stack exchange,提问作者NobilisRex
相关产品推荐
相关产品推荐

