【问题标题】:MongoDb update with ElemMatch使用 ElemMatch 更新 MongoDb
【发布时间】:2025-11-21 19:45:02
【问题描述】:

我有一个具有如下文档结构的集合:

Mongo PlayGround

{
    "basicDetails": {
        "id": "1",
        "name": "xyz"
    },
    "tasks": [{
        "id": "10",
        "name": "task10",
        "subtasks": [{
            "id": "120",
            "name": "subTask120",
            "description": "ABC"
        }]
    }]
}

如您所见,每个文档都有 basicDetails 对象和一个 tasks 数组。每个任务都包含自己的一些属性和一个子任务数组。

我想将子任务的描述从 ABC 更新为 XYZ

where root level id is 1, task'id is 10 and subTasks.id =120

我该怎么做?

我知道我可以通过以下方式找到正确的文档:

db.collection.find({
  "basicDetails.id": "1",
  "tasks": {
    "$elemMatch": {
      "id": "10",
      "subtasks": {
        "$elemMatch": {
          "id": "120"
        }
      }
    }
  }
})

但是我该如何更新呢?我只想更新单个子任务的一个属性,即描述

【问题讨论】:

  • 你尝试了什么?顺便说一句,我可以推荐一些 Mongo 大学的 101 个。
  • @A.D. db.Projects.updateOne({"basicDetails.id":"200" , "tasks":{"$elemMatch":{"basicDetails.id":"139","subtasks":{"$elemMatch":{"name":"xyz3"} }}} }, {$set: {'basicDetails.$.tasks.basicDetails': 'Blah'}} )

标签: javascript node.js mongodb mongodb-query nosql


【解决方案1】:

要更新嵌套数组,过滤的位置运算符 $[identifier] 会识别与更新操作的 arrayFilters 条件匹配的数组元素。

尝试对嵌套数组中的$set 进行以下查询:

db.collection.updateOne({
  "basicDetails.id": "1"
},
{
  "$set": {
    "tasks.$[tasks].subtasks.$[subtasks].description": "XYZ"
  }
},
{
  "arrayFilters": [
    {
      "tasks.id": "10"
    },
    {
      "subtasks.id": "120"
    }
  ]
})

MongoDB Playground

【讨论】:

  • 不推荐使用 update() 吗?这可以用 UpdateOne() 完成吗?还是 UpdateMany()?