mongodb обновляет несколько элементов массива с помощью db.update()

#mongodb #mongodb-update

#mongodb #mongodb-обновление

Вопрос:

Я скомпилировал 2 запроса на обновление, обратившись к связанным ответам stackoverflow, однако, похоже, это не работает, запрос обновляет все элементы, в то время как ожидается обновление только элементов, соответствующих критериям.

Документ:

 [
  {
    "_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: используя оператор сопоставления элементов, игровая площадка 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 статус должен быть обновлен до активного.

Фактический результат: оба запроса обновляют все записи.

Комментарии:

1. кроме того, включите образец документа, $elemMatch который мне кажется редким

2. yyou мог бы сделать "members.email":{$in..."

3. @turivishal, мне может потребоваться обновить несколько документов, в примере я только что рассмотрел только один документ.

Ответ №1:

Это то, что вы ищете?

 db.collection.update({
  _id: 259,  
},
{
  "$set": {
    "members.$[el].status": "active"
  }
},
{
  arrayFilters: [
    {
      "el.email": {
        $in: [
          "test3@gmail.com",
          "test4@gmail.com"
        ]
      }
    }
  ]
})
 
  • При необходимости вы можете вернуть начальные условия, я просто сохраняю это вкратце (и для меня они не имеют смысла).
  • multi:true не требуется для одного документа
  • Может быть, лучше семантически использовать updateOne()