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

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等于给定值的对象

注意事项

  1. 确保使用MongoDB 4.2及以上版本,该版本才支持多层嵌套数组的更新操作
  2. 若需要仅对包含目标对象的文档执行更新,可保留查询条件{"main_array.sub_array.info._id": given_id},减少无意义的文档扫描

内容的提问来源于stack exchange,提问作者ARHAM RUMI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 08:05:31