mongodb 使用 db.update() 更新多个数组元素

问题描述

我参考相关的 stackoverflow 答案编译了 2 个更新查询,但是,它似乎不起作用,查询更新所有元素,而只有符合条件的元素才会更新。

文档:

[
  {
    "_id": 259,"members": [
      {
        "email": "test1@gmail.com","added_by": "javapedia.net","status": "pending"
      },{
        "email": "test2@gmail.com",{
        "email": "test3@gmail.com","status": "pending"
      }
    ]
  }
]

Query1:使用 elemMatch 运算符,mongodb playground:https://mongoplayground.net/p/4cNgWJse86W

db.collection.update({
  _id: 259,"members": {
    "$elemMatch": {
      "email": {
        "$in": [
          "test3@gmail.com","test4@gmail.com"
        ]
      }
    }
  }
},{
  "$set": {
    "members.$[].status": "active"
  }
},{
  "multi": true
})

Query2: using $in,mongodb playground : https://mongoplayground.net/p/tNu395B2RFx

db.collection.update({
  _id: 259,"members.email": {
    "$in": [
      "test3@gmail.com","test4@gmail.com"
    ]
  }
},{
  "multi": true
})

预期结果:只有一个具有 test3@gmail.com 状态的元素应更新为活动。

实际结果:两个查询都更新了所有记录。

解决方法

Is this what you're looking for?

db.collection.update({
  _id: 259,},{
  "$set": {
    "members.$[el].status": "active"
  }
},{
  arrayFilters: [
    {
      "el.email": {
        $in: [
          "test3@gmail.com","test4@gmail.com"
        ]
      }
    }
  ]
})
  • 如果需要,你可以把初始条件放回去,我只是保持简短(对我来说它们没有意义)。

  • multi:true 不需要一个文档

  • 在语义上使用 updateOne()

    可能更好

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...