MongoDB使用forEach更新数组内对象仅更新首个的问题求助
问题分析与解决方案
问题根源
你当前的代码仅在内存中修改了文档对象,没有将修改后的内容写回MongoDB数据库,所以修改不会持久化到集合中。另外,print(v)放在内层循环里,只会在每次修改parts元素时打印当前vehicle对象,导致输出不完整。
修复方案
方案1:在forEach中添加数据库保存操作
如果要保留forEach的写法,需要在修改完parts后调用save()方法将文档写回数据库:
db.getCollection("vehicles").find({}).forEach(function(v){ let updated = false; v.parts.forEach(function(p){ if(p.partName === "brake" && p.sellingPrice <= 170.00){ p.sellingPrice = 500.00; updated = true; } }); // 仅当文档被修改时执行保存,提升效率 if(updated){ db.getCollection("vehicles").save(v); print(v); } })
方案2:使用MongoDB原生数组更新操作(推荐)
这种方式无需遍历全集合,直接通过数据库指令完成更新,性能更优,是MongoDB处理数组更新的标准方式:
db.getCollection("vehicles").updateMany( // 匹配包含符合条件parts的文档 { "parts": { $elemMatch: { "partName": "brake", "sellingPrice": { $lte: 170.00 } } } }, // 更新匹配到的数组元素 { $set: { "parts.$[elem].sellingPrice": 500.00 } }, // 定义数组过滤器,指定要更新的元素 { arrayFilters: [ { "elem.partName": "brake", "elem.sellingPrice": { $lte: 170.00 } } ], multi: true // 允许更新文档内多个符合条件的数组元素 } )
验证结果
执行任一方案后,可通过以下查询验证更新效果:
db.getCollection("vehicles").find({ "parts.partName": "brake" }, { "parts.$": 1 })
内容的提问来源于stack exchange,提问作者Ranjith Kumar
相关产品推荐
相关产品推荐

