如何为MongoDB中非数组子文档下的所有子文档添加字段?
解决方案
你之前的报错原因没错,$和$[]都是数组操作符,只适用于数组类型字段,而你的obj是嵌套对象,所以用这些操作符会触发错误。要实现给obj下所有子文档统一添加字段的需求,需要用MongoDB 4.2及以上版本支持的聚合管道式更新,具体实现如下:
执行语句
db.collection.update( { _id: "something" }, [ { $set: { obj: { $arrayToObject: { $map: { input: { $objectToArray: "$obj" }, as: "item", in: { k: "$$item.k", v: { $mergeObjects: [ "$$item.v", { anotherProp: "$topLevelProp" } ] } } } } } } } ] )
语句逻辑说明
$objectToArray: "$obj":将obj嵌套对象转换为键值对数组,比如{ prop1: {...}, prop2: {...} }会被转为[{ k: "prop1", v: {...} }, { k: "prop2", v: {...} }]$map遍历处理:对每个键值对元素,用$mergeObjects把原子文档($$item.v)和新字段{ anotherProp: "$topLevelProp" }合并,给每个子文档添加上目标字段$arrayToObject还原结构:将处理后的键值对数组重新转换为嵌套对象,替换原有的obj字段
最终效果
执行后文档会变为你预期的结构:
{ _id: 'something', topLevelProp: 'top', obj: { prop1: { a: 'a', b: 'b', anotherProp: 'top' }, prop2: { a: 'x', b: 'y', anotherProp: 'top'}, prop3: {a: 'x', anotherProp: 'top'} } }
内容的提问来源于stack exchange,提问作者J. Ed
相关产品推荐
相关产品推荐

