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

mongodb update multiple Array elements using db.update()

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

文件:

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

查询 1:使用 elemMatch 运算符,mongodb 操场: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
})

查询 2:使用 $in,mongodb 游乐场:https://mongoplayground.net/p/tNu395B2RFx

db.collection.update({
  _id: 259,
  "members.email": {
    "$in": [
      "test3@gmail.com",
      "test4@gmail.com"
    ]
  }
},
{
  "$set": {
    "members.$[].status": "active"
  }
},
{
  "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()

    语义上可能更好