如何使用Mongoose(Node.js)更新MongoDB嵌套数组内的子数组字段
解决MongoDB双层嵌套数组内层元素更新问题
问题场景
现有如下结构的MongoDB文档,需要更新services数组下videos子数组中指定元素的status字段:
{ "_id": "62da8472669b750870b094f6", "name": "Test Expert", "user_id": "62bdabee9aa50c0028d60767", "services": [ { "service_name": "Hello 2", "service_id": "62ce7393534bda04d40f42c3", "_id": "62ce7394534bda04d40f42c4", "videos": [ { "_id": "62da8472669b750870b094f8", "lv_guid_id": "fsdfdshflsdhj", "status": "REQUESTED" // 需要更新该元素的status }, { "_id": "62da8472669b750870b09sdw", "lv_guid_id": "gdfgdfgfdg", "status": "REQUESTED" // 需要更新该元素的status } ] } ], "__v": 0 }
原尝试代码无法获取内层videos数组元素的位置,导致无法精准更新:
this.findOneAndUpdate( { _id: new mongoose.Types.ObjectId(orderID), "services._id": new mongoose.Types.ObjectId(videoDetail.service_id), "services.videos.lv_guid_id": videoDetail.lv_guid_id }, { $set: { "services.$.videos./*Need to fetch the position of this element to update*/.status": videoDetail.status } }, { upsert: true, new: true } );
解决方案
MongoDB 3.6及以上版本支持过滤数组定位符$[<identifier>],可以精准匹配嵌套数组中满足条件的元素,完美解决双层嵌套数组的更新问题。
修改后的代码
this.findOneAndUpdate( { _id: new mongoose.Types.ObjectId(orderID), "services._id": new mongoose.Types.ObjectId(videoDetail.service_id) }, { $set: { "services.$.videos.$[video].status": videoDetail.status } }, { upsert: true, new: true, arrayFilters: [{"video.lv_guid_id": videoDetail.lv_guid_id}] } );
代码说明
services.$:外层定位符,匹配services数组中_id符合条件的元素$[video]:内层过滤定位符,通过arrayFilters中的规则,匹配videos数组中lv_guid_id等于目标值的元素arrayFilters:定义内层数组元素的匹配条件,这里指定只更新lv_guid_id为videoDetail.lv_guid_id的videos元素
这样就能精准定位到需要更新的内层数组元素,完成status字段的修改。
内容的提问来源于stack exchange,提问作者Curvegraph
相关产品推荐
相关产品推荐

