Mongodb: помещает элемент во вложенный массив, если условие выполнено

#mongodb #mongoose

#mongodb #mongoose

Вопрос:

У меня есть следующая коллекция:

 {
    "_id": 11,
    "outerArray": [
        { "_id" : 21,
          "field": {
              "innerArray" : [
                  1,
                  2,
                  3
               ]
            }
        }, 
        { "_id" : 22,
          "field": {
              "innerArray" : [
                  2,
                  3
               ]
            }
        }, 
        { "_id" : 23,
          "field": {
              "innerArray" : [
                  2
               ]
            }
        }
    ]
}
 

Мне нужно просмотреть все документы в коллекции и перейти к innerArray новому элементу 4 , если innerArray он уже содержит элемент 1 или элемент 3

Я пытался сделать это таким образом, и несколько других, похожих на этот, но это сработало не так, как ожидалось, он только нажимает на innerArray первый элемент outerArray

 db.collection.updateMany( 
    { "outerArray.field.innerArray": { $in: [ 1, 3 ] } },
    { $push: { "outerArray.$.field.innerArray": 4} }
)
 

Как заставить его передавать все innerArrays соответствующие?

Ответ №1:

Проблема здесь в том, что вы не понимаете связку вещей.

Когда вы выполняете "outerArray.field.innerArray": { $in: [ 1, 3 ] } свой запрос, вы не получаете только innerArray там, где есть 1 или 3. Вы получаете документы, в которых существуют эти массивы.

Итак, вы запрашиваете весь документ.

Вы должны использовать arrayFilter для обновления значений при совпадении фильтра.

Итак, если я вас правильно понял, запрос, который вы хотите:

 db.collection.update(
{}, //Empty object to find all documents
{
  $push: { "outerArray.$[elem].field.innerArray": 4 }
},
{
  "arrayFilters": [ { "elem.field.innerArray": { $in: [ 1, 3 ] } } ]
})
 

Пример здесь

Обратите внимание, что первый объект в update пуст. Вы должны поместить туда поле, соответствующее документу (не массиву, документу).

Если вы хотите обновить только один документ, вам нужно заполнить первый объект (объект запроса) нужными значениями, например: {"_id": 11} .

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

1. голос за веб-сайт mongoplayground, не знал, что он существует!