MongoDB如何将顶层非嵌套字段赋值给数组内每个嵌套元素对应字段
根因说明
普通形式的MongoDB update语句不支持引用当前文档的字段值作为更新的右值,你写的"$myField"会被直接识别为普通字符串写入,不会解析为顶层myField字段的取值。
解决方案
方案1(推荐,适用于MongoDB 4.2及以上版本)
使用聚合管道形式的update实现字段引用,通过$map遍历数组后合并字段,示例代码如下:
db.collection.update( { "myObjects": { $exists: true } }, [ { $set: { myObjects: { $map: { input: "$myObjects", as: "item", in: { $mergeObjects: [ "$$item", { "myField": "$myField" } ] } } } } } ], { multi: true } )
逻辑说明:
- update的第二个参数传入数组,代表启用聚合管道更新模式,支持直接引用当前文档的字段值
$map遍历myObjects数组的每一个元素$mergeObjects将原数组元素和新增的myField字段(值取自顶层myField)合并,生成新的数组元素
方案2(适用于MongoDB 4.2以下版本)
通过游标遍历文档逐个更新,示例代码如下:
db.collection.find({ "myObjects": { $exists: true } }).forEach(doc => { // 先取到顶层myField的取值 const topMyField = doc.myField; // 遍历数组逐个赋值 doc.myObjects.forEach(item => { item.myField = topMyField; }); // 保存修改后的文档 db.collection.save(doc); })
注意:该方案在数据量较大时性能较差,建议优先升级MongoDB版本使用方案1。
内容的提问来源于stack exchange,提问作者MateoB27
相关产品推荐
相关产品推荐

