如何修正MongoDB嵌套对象数组中的错误字段名?
问题分析与解决方案
你的代码有两个核心错误,导致无法正确修改字段名:
错误1:更新的查询条件完全错误
你在update里用{"_id": subtype._id}作为查询条件,但这个subtype._id是数组子文档的ID,而集合中每个文档的主键是外层的_id(比如示例里的"1234"),所以这个查询根本找不到任何要更新的文档,自然不会生效。
错误2:数组字段的更新路径不精准
直接写subtypes.subjectRequired会试图把数组中所有子文档的subjectRequired字段设置成同一个值,而且无法定位到具体有拼写错误的那个子文档。
正确解决方案
方案1:用聚合管道批量更新(推荐,高效)
适合MongoDB 3.4+版本,直接批量处理所有符合条件的文档,不需要循环遍历:
db.taskType.updateMany( // 匹配所有包含拼写错误字段的文档 {"subtypes.subjetRequired": {$exists: true}}, [ { $set: { "subtypes": { // 遍历subtypes数组的每个元素 $map: { input: "$subtypes", in: { // 合并原对象与修正后的字段,移除错误字段 $mergeObjects: [ "$$this", { subjectRequired: "$$this.subjetRequired", subjetRequired: "$$REMOVE" } ] } } } } } ] )
方案2:修正你原有的循环脚本
如果你想保留遍历的逻辑,修改后的代码如下:
function remap(doc) { doc.subtypes.forEach(function(subtype, index) { // 只处理存在拼写错误字段的子文档 if (subtype.subjetRequired !== undefined) { // 用外层文档的_id作为查询条件 db.taskType.updateOne( {"_id": doc._id}, { // 通过数组索引精准定位要更新的子文档 $set: {["subtypes." + index + ".subjectRequired"]: subtype.subjetRequired}, $unset: {["subtypes." + index + ".subjetRequired"]: 1} } ); } }); } // 查找所有包含错误字段的文档并处理 db.taskType.find({"subtypes.subjetRequired": {$exists: true}}).forEach(remap);
内容的提问来源于stack exchange,提问作者mal
相关产品推荐
相关产品推荐

