MongoDB更新对象数组未按预期生效,$占位符无法匹配指定元素
问题根因
- 核心错误为查询条件和存储字段的数据类型不匹配:你示例文档中
idMeal是数值类型,而第一条更新语句里$elemMatch匹配的是字符串类型的"1",导致$elemMatch未命中任何符合条件的子文档。 - 你提供的第二条更新语句里匹配的
idMeal值为319012,如果对应文档的result数组中无此id的子文档,也会出现匹配失败的问题。
解决方案
方法1:修正原有语法的类型匹配
将查询条件里的idMeal值改为和存储一致的数值类型即可正常匹配,示例代码:
db.meals.updateOne( { "searchWord": "pizz", "result": { $elemMatch: { idMeal: 1 } } }, { $set: { 'result.$.strMeal' : "UPDATED" } } )
方法2:使用更稳定的arrayFilters语法
MongoDB 3.6及以上版本推荐使用arrayFilters做数组元素匹配,不受查询条件限制,定位更精准,不会出现异常匹配索引的问题:
db.meals.updateOne( { "searchWord": "pizz" }, { $set: { "result.$[target].strMeal" : "UPDATED" } }, { arrayFilters: [ { "target.idMeal": 1 } ] } )
验证更新结果
执行更新后可通过以下语句验证修改是否生效:
db.meals.find({ "searchWord": "pizz" }, { "result": 1, "_id": 0 })
正常返回结果中idMeal=1的子文档strMeal字段会变为UPDATED。
内容的提问来源于stack exchange,提问作者Lajos Bela
相关产品推荐
相关产品推荐

