Mongoose中深度嵌套数组(数组嵌套数组)的对象更新问题
问题:更新嵌套数组中匹配条件的字段
数据结构
{ "_id": "659e76b929be316e566cdc36", "main_array": [ { "_id": "659e76b929be316e566cdc39", "sub_array": [ [ { "_id": "659e76b929be316e566cdc3c", "info": { "_id": "654b725918297c74977025da", "title": "Cycling" }, // Other fields }, { "_id": "659e76b929be316e566cdc3e", "info": { "_id": "654b717718297c74977025c6", "title": "Running" }, // Other fields } ], [ { "_id": "659e76b929be316e566cdc42", "info": { "_id": "654b725918297c74977025da", "title": "Cycling" }, // Other fields } ] ] } ] }
需求
更新所有info._id与给定given_id匹配的对象中的title字段。
已尝试的查询方案
方案1
await MyModel.updateMany( {}, { $set: { "main_array.$[].sub_array.$[].$[inner].info.title": new_title }, }, { arrayFilters: [ { "inner.info._id": given_id }, ], } );
方案2
await MyModel.updateMany( {}, { $set: { "main_array.$[].sub_array.$[inner].info.title": new_title }, }, { arrayFilters: [ { "inner.info._id": given_id }, ], } );
方案3
await MyModel.updateMany( {"main_array.sub_array.info._id": given_id}, { $set: { "main_array.$[].sub_array.$[inner].info.title": new_title }, }, { arrayFilters: [ { "inner.info._id": given_id }, ], } );
解决方案
针对数组嵌套数组的场景,需要正确遍历两层数组结构,结合数组过滤器精准定位目标对象。正确的更新语句如下:
await MyModel.updateMany( {}, { $set: { "main_array.$[].sub_array.$[].$[target].info.title": new_title } }, { arrayFilters: [ { "target.info._id": given_id } ] } );
关键说明
main_array.$[]:遍历main_array中的所有元素sub_array.$[]:遍历每个main_array元素下sub_array中的所有子数组$[target]:遍历每个子数组内的对象,通过数组过滤器匹配符合条件的目标对象- 数组过滤器
{"target.info._id": given_id}:精准筛选出info._id等于给定值的对象
注意事项
- 确保使用MongoDB 4.2及以上版本,该版本才支持多层嵌套数组的更新操作
- 若需要仅对包含目标对象的文档执行更新,可保留查询条件
{"main_array.sub_array.info._id": given_id},减少无意义的文档扫描
内容的提问来源于stack exchange,提问作者ARHAM RUMI
相关产品推荐
相关产品推荐

