如何使用Mongoose更新MongoDB中多层嵌套数组内的指定字段值
嵌套数组更新失效原因
MongoDB 原生的$位置运算符仅支持匹配查询条件中的第一层数组下标,无法直接穿透到第二层及以上的嵌套数组定位元素,因此你原来的写法无法命中内层数组的目标字段。
正确实现方案(MongoDB 3.6+ 官方推荐)
使用MongoDB 3.6版本新增的$[<alias>]数组过滤标识符配合arrayFilters参数实现多层嵌套数组的精准更新,示例代码如下:
const newState = await MyModel.findOneAndUpdate( // 主查询条件,定位顶层文档 { code: code }, // 更新语句,分别为两层数组定义过滤别名 { $set: { 'array1.$[outerElem].array2.$[innerElem].value': true } }, { new: true, // 数组过滤规则,分别匹配两层数组的条件 arrayFilters: [ // 外层数组过滤规则,可按需添加额外约束 { 'outerElem.array2': { $exists: true } }, // 内层数组过滤规则,精准匹配identifier对应的元素 { 'innerElem.identifier': identifier } ] } );
注意事项
- 若使用低于3.6版本的MongoDB,不支持
arrayFilters参数,需要先查询获取外层数组满足条件的下标,再手动拼接更新路径执行更新,该方案存在并发更新冲突风险,建议优先升级MongoDB版本使用上述推荐方案 - 需要确保Mongoose版本 >= 5.0 才支持
arrayFilters参数传递 - 注意schema定义中
array1、array2的结构和字段类型要和实际存储一致,避免类型匹配失败导致更新不生效
内容的提问来源于stack exchange,提问作者SomethingElse
相关产品推荐
相关产品推荐

