#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, не знал, что он существует!