You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 22:45:37