MongoDB中如何实现对象合并,将t_f_t字段内容合并至data对象
MongoDB 动态键合并操作实现方案
适用版本
MongoDB 4.2 及以上版本
直接更新文档(修改存储数据)
使用带聚合管道的updateMany操作,直接将合并后的结果写入文档,代码如下:
db.yourCollectionName.updateMany( // 匹配条件,可按需修改,此处为匹配所有文档 {}, [ { $set: { data: { $mergeObjects: [ // 保留原data字段的所有键值对 "$data", // 生成 t_f 对应的键值对 { $arrayToObject: [[ { k: "$t_f_t.t_f", v: "$t_f_t.v" } ]] }, // 生成 t_t 对应的键值对 { $arrayToObject: [[ { k: "$t_f_t.t_t", v: "$t_f_t.v" } ]] } ] } } }, // 可选:删除已不需要的t_f_t字段,无需删除可注释此行 { $unset: "t_f_t" } ] )
查询时实时转换(不修改存储数据)
如果只需要返回符合预期的结果,不修改原始存储的文档,使用聚合查询即可:
db.yourCollectionName.aggregate([ { $addFields: { data: { $mergeObjects: [ "$data", { $arrayToObject: [[ { k: "$t_f_t.t_f", v: "$t_f_t.v" } ]] }, { $arrayToObject: [[ { k: "$t_f_t.t_t", v: "$t_f_t.v" } ]] } ] } } }, // 可选:返回结果中隐藏t_f_t字段 { $project: { t_f_t: 0 } } ])
核心操作符说明
$arrayToObject:将包含k(键名)、v(键值)结构的数组转换为对象,实现动态使用t_f、t_t的取值作为键的需求$mergeObjects:合并多个对象,存在重复键时后定义的对象值会覆盖前面对象的同键值,符合常规合并逻辑
内容的提问来源于stack exchange,提问作者bc110402922
相关产品推荐
相关产品推荐

