Пн goose Обновление массива в нескольких документах путем передачи массива фильтров для обновления запроса - PullRequest
1 голос
/ 29 января 2020

У меня есть несколько документов (3 документа в этом примере) в одной коллекции, которая выглядит следующим образом:

{
   _id:123,
   bizs:[{_id:'',name:'a'},{_id:'',name:'b'}]
},

{
  _id:456,
  bizs:[{_id:'',name:'e'},{_id:'',name:'f'}]
}

{
  _id:789,
  bizs:[{_id:'',name:'x'},{_id:'',name:'y'}]
}

Теперь я хочу обновить поддокумент bizs, сопоставив его с моим массивом идентификаторов. То есть мой фильтр массива для запроса на обновление - [123,789], который будет соответствовать полям _id каждого документа. Я пытался использовать findByIdAndUpdate () , но это не позволяет использовать массив для запроса на обновление

Как я могу обновить 2 соответствующих документа (как в моем примере выше), не помещая findByIdAndUpdate внутри forl oop для сопоставления элемента массива с _id?

1 Ответ

2 голосов
/ 30 января 2020

Вы не можете использовать findByIdAndUpdate при обновлении нескольких документов, findByIdAndUpdate из mon goose, который является оболочкой для нативного MongoDB findOneAndUpdate . Когда вы передаете одну строку в качестве фильтра findByIdAndUpdate, например: Collection.findByIdAndUpdate({'5e179dac627ef7823643cd97'}, {}) - тогда mon goose внутренне преобразует string в ObjectId() и формирует ее в виде фильтра, подобного: _id : ObjectId('5e179dac627ef7823643cd97') для выполнения findOneAndUpdate , Это означает, что вы можете обновлять только один документ за раз. Поэтому, если требуется обновить несколько документов, используйте update с опцией {multi : true} или updateMany .

Предположим, что если вы хотите создать sh новый объект для bizs, запрос выглядит следующим образом:

collection.updateMany({ _id: { $in: [123, 456] } }, {
    $push: {
        bizs: {
            "_id": "",
            "name": "new"
        }
    }
})

Примечание: Операции обновления не выполняются не возвращайте документы в ответ, скорее они вернут результат записи , в котором есть информация о n совпавших документах и ​​n измененных документах.

...