MongoDB按多条件更新内嵌对象数组仅第一个生效如何解决?
问题原因
- 当前查询条件没有限制
task_group_id和task_id必须匹配同一个task_groups数组元素。MongoDB默认处理数组多字段查询时,只要整个数组内存在任意元素满足task_group_id条件、同时存在任意元素满足task_id条件,就会判定文档匹配,不会要求两个条件落在同一个数组元素上。 - 位置运算符
$只会记录第一个满足数组匹配规则的元素下标,所以每次更新的都是第一个数组元素,匹配第二个task_group_id的更新请求自然无法生效。另外你原有语句的$set外层遗漏了对象包裹,也存在语法问题。
解决方法
在查询条件中使用$elemMatch运算符,限定同一个task_groups数组元素同时满足task_group_id和task_id两个条件,即可让$正确定位到你要更新的数组元素。
修改后的更新语句如下:
db.task_status.updateOne( { user_id: new ObjectId(payload.user_id), taskboard_id: new ObjectId(payload.taskboard_id), "task_groups": { $elemMatch: { task_group_id: new ObjectId(payload.task_group_id), task_id: new ObjectId(payload.task_id) } } }, { $set: { "task_groups.$.is_completed": payload.is_completed, "task_groups.$.completion_date": new Date(), } } );
内容的提问来源于stack exchange,提问作者justAnAnotherCoder
相关产品推荐
相关产品推荐

