Я хочу обновить свойство объектов, расположенных в нескольких списках в документе коллекции MongoDB.
В коллекции MongoDB у меня есть такие документы:
{
"firstArray": [
{
"name": "john",
"updated": false // I wanna switch that to true
},
{
"name": "bob",
"updated": false
}
],
"secondArray": [
{
"name": "eric",
"updated": false
},
{
"name": "john",
"updated": false // I wanna switch that to true
}
]
}
Моя цель - обновить каждый элемент с помощью "name":"john"
из свойств документа firstArray
и secondArray
до updated:true
.
Поскольку они могут быть параллельными доступами к документу, я буду использовать только операторы обновления (метод чтения и замены подобный этому добавит риск удаления изменений, сделанных другим процессом)
Это выглядит как отфильтрованный позиционный оператор $[] как упомянутый в этом вопросе, является способом обновить свойство объекта из массива документа НО похоже, что он не поддерживает несколько $set
с одним и тем же оператором и использование двух операторов (по одному массиву) в двух разных $set
!
Поскольку эта команда оболочки mongo обновляет только secondArray
:
db['collection'].update(
{},
{
"$set": { "firstArray.$[elem].updated": true },
"$set": { "secondArray.$[elem].updated": true }
},
{ "arrayFilters": [{ "elem.name": "john" }], "multi": true })
И эта команда возвращает The array filter for identifier 'a' was not used in the update { $set: { secondArray.$[b].updated: true } }
:
db['collection'].update(
{},
{
"$set": { "firstArray.$[a].updated": true },
"$set": { "secondArray.$[b].updated": true }
},
{ "arrayFilters": [{ "a.name": "john" }, { "b.name": "john" }], "multi": true })
Итак, у вас есть идеи, как сделать это обновление? (Бонусный балл за любые цитаты из документации о вышеуказанных ограничениях)
Спасибо!
$set
(хотя и не без причины), но фактическая страница для оператора$set
четко указать пример для обновления различных свойств за одно использование. 17.03.2020