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

Mongoose教程:如何更新对象数组中指定子文档的字段值

如何更新MongoDB数组中符合条件的子文档字段

集合示例数据

[
  {
    "_id": ObjectId("649d1b0b5e40905678a30829"),
    "slug": "samsung-s22",
    "name": "Samsung S22",
    "params": [
      {
        "modelno": "SM-S901B",
        "color": "White",
        "price": "64000",
        "_id": ObjectId("649e70bdd20e94bef90f2e7f")
      },
      {
        "modelno": "SM-S901B",
        "color": "Black",
        "price": "64000",
        "_id": ObjectId("649e70bdd20e94bef90f2e7d")
      },
      {
        "modelno": "SM-S901U",
        "color": "Black",
        "price": "74000",
        "_id": ObjectId("649e70bdd20e94bef90f2a7f")
      },
      {
        "modelno": "SM-S901U",
        "color": "Black",
        "price": "74000",
        "_id": ObjectId("649e70bdd20e94bef90f2b7f")
      }
    ]
  },
  {
    "_id": ObjectId("649d1b0b5e40905678a30819"),
    "slug": "vivo-v19",
    "name": "Vivo V19",
    "params": [
      {
        "modelno": "Vivo 1933",
        "color": "Grey",
        "price": "34000",
        "_id": ObjectId("659e70bdd20e94bef90f2e7f")
      },
      {
        "modelno": "Vivo 1933",
        "color": "Black",
        "price": "34000",
        "_id": ObjectId("659e70bdd20e94bef90f2e7d")
      },
      {
        "modelno": "Vivo 2933",
        "color": "Black",
        "price": "44000",
        "_id": ObjectId("659e70bdd20e94bef90f2a7f")
      }
    ]
  }
]

需求说明

需要更新指定条件下数组子文档的price字段:当文档name为"Samsung S22",且子文档modelno为"SM-S901B"时,将这些子文档的price值改为"69999",仅更新匹配的子文档,其他子文档不受影响。

解决方案

使用MongoDB的updateMany结合过滤位置操作符实现批量更新,命令如下:

db.collection.updateMany(
  // 查询条件:匹配name为Samsung S22且包含指定modelno的文档
  {
    "name": "Samsung S22",
    "params.modelno": "SM-S901B"
  },
  // 更新操作:设置匹配子文档的price字段
  {
    "$set": {
      "params.$[elem].price": "69999"
    }
  },
  // 数组过滤规则:仅匹配modelno为SM-S901B的子文档
  {
    "arrayFilters": [
      { "elem.modelno": "SM-S901B" }
    ]
  }
)

命令说明

  1. 查询条件:先定位到name为"Samsung S22"的主文档,同时确保该文档的params数组中存在modelno为"SM-S901B"的子文档;
  2. 更新操作:通过$[elem]占位符指定要更新的数组元素,elem对应arrayFilters中定义的过滤规则;
  3. 数组过滤:arrayFilters定义了子文档的匹配条件,只有符合modelno: "SM-S901B"的子文档才会被更新。

执行该命令后,符合条件的两个子文档price会被修改为"69999",其他子文档保持不变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:51:39