MongoDB聚合中如何添加基于集合数据的动态字段名?
MongoDB视图动态拼接字段名实现方案
问题场景
需要在MongoDB视图的聚合逻辑中新增一个动态字段,字段名由现有字段拼接而成,且仅当特定条件满足时生成。
示例集合数据
{ "data": { "computed_type": "sleep", "source": "watch", "type": "inBed", "value": 60 } }
期望视图输出
{ "sleep_watch_inbed": 60 }
尝试的无效聚合代码
{ $project: { dynamicKey: { $map: { input: { $objectToArray: "$data" }, as: "elem", in: { $cond: [ { $eq: ["elem.computed_type", "sleep"] }, { $concat: ["sleep_", 'elem.type', "_", 'elem.source'] }, "$elem.computed_type" ] } } } } }
问题分析
原代码存在几个核心问题:
$map处理的是data转成的键值对数组,每个elem结构为{k:字段名, v:字段值},直接调用elem.computed_type无法正确取值$map返回的是数组,无法直接生成动态键值对结构- 未将拼接后的键名与
value字段关联绑定
正确聚合实现
结合$cond条件判断、$concat键名拼接、$arrayToObject对象转换,可实现需求,代码如下:
[ { $project: { _id: 0, dynamicFields: { $cond: [ { $eq: ["$data.computed_type", "sleep"] }, { $arrayToObject: [[{ k: { $concat: ["$data.computed_type", "_", "$data.source", "_", { $toLower: "$data.type" }] }, v: "$data.value" }]] }, {} ] } } }, { $replaceRoot: { newRoot: "$dynamicFields" } } ]
代码说明
- 用
$cond判断data.computed_type是否等于sleep - 满足条件时,通过
$concat拼接目标键名(用$toLower将type转为小写,匹配示例结果),同时绑定data.value作为字段值,再通过$arrayToObject将键值对数组转为对象 - 最后用
$replaceRoot将动态字段对象提升到根层级,得到期望结构
内容的提问来源于stack exchange,提问作者Aysha
相关产品推荐
相关产品推荐

