MongoDB批量更新数组对象字段值的查询修正请求
MongoDB批量更新数组字段的正确写法
原查询的问题
$map的input参数错误:你用了$info.field1,这会提取info数组中每个元素的field1值形成字符串数组,而非遍历整个info对象数组,导致无法正确处理每个完整的数组元素- 替换逻辑错误:原代码会把符合条件的数组元素直接替换成字符串
"STRING_NEW",丢失了原元素的其他字段(比如field2),不符合需求 - 查询条件冗余:原条件仅检查
info.field1存在,应该直接匹配info.field1: "String1",只更新确实需要修改的文档
修正后的查询
db.model.updateMany( // 只匹配info数组中存在field1为"String1"的文档 { "info.field1": "String1" }, [ { "$set": { "info": { "$map": { "input": "$info", // 遍历整个info对象数组 "in": { "$cond": [ { "$eq": ["$$this.field1", "String1"] }, // 匹配时,合并原对象与新的field1值,保留其他字段 { "$mergeObjects": ["$$this", { "field1": "STRING_NEW" }] }, // 不匹配时,直接保留原对象 "$$this" ] } } } } } ] )
说明
$map遍历info数组的每个对象元素$cond判断当前元素的field1是否为"String1"- 匹配时用
$mergeObjects将原对象和新的field1值合并,既更新目标字段,又保留field2等其他字段不变 - 查询条件精准匹配需要修改的文档,提升更新效率
内容的提问来源于stack exchange,提问作者RagaSGNur
相关产品推荐
相关产品推荐

