如何从MongoDB文档嵌套数组内对象的数组中删除指定值
失效原因排查
你写的更新语句逻辑本身是正确的,绝大多数情况下不生效都是查询条件没有匹配到对应文档导致的,常见的不匹配场景如下:
availabilities.User字段存储的是MongoDB ObjectId类型,你传入的id2是字符串格式,类型不匹配导致无法命中文档period字段或要删除的日期值传入了字符串类型,和文档内存储的数字类型不匹配- 传入的周期值、用户ID本身在集合内不存在对应数据
修复写法
写法1:调整原语句的类型匹配
如果确认是ObjectId类型不匹配问题,把用户ID转为对应类型即可,示例(Node.js环境):
// Mongoose 环境写法 DB.updateOne( { "period": 20218, "availabilities.User": mongoose.Types.ObjectId(id2) }, { $pull: { "availabilities.$.Useravailabilities": 13 } } ) // 原生MongoDB驱动写法 DB.updateOne( { "period": 20218, "availabilities.User": new ObjectId(id2) }, { $pull: { "availabilities.$.Useravailabilities": 13 } } )
写法2:使用arrayFilters(更稳妥,兼容性更好)
针对嵌套数组更新,用arrayFilters的写法逻辑更清晰,也避免了$占位符可能出现的匹配偏差:
DB.updateOne( { "period": 20218 }, { $pull: { "availabilities.$[userItem].Useravailabilities": 13 } }, { arrayFilters: [ { "userItem.User": id2 } ] } )
验证方法
执行更新前可以先运行查询语句确认能命中目标文档,排除匹配问题:
DB.findOne({ "period": 20218, "availabilities.User": id2 })
如果上述查询返回null,说明确实是查询条件的匹配问题,和更新逻辑无关。
内容的提问来源于stack exchange,提问作者Thermikus
相关产品推荐
相关产品推荐

