У меня есть документ вроде
"_id" : ObjectId("5b0cf3b77f8b9a0a1330f26s"),
"group" : ObjectId("5b0cf3b77f8b9a0a1330f27f"),
"referrers" : [
{
"referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20c")
},
{
"referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20d")
},
{
"referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20e")
}
]
Теперь мне нужно обновить один новый элемент {"canAddUse" : true
} для вложенного массива рефереров во всех документах. Результат должен быть таким:
"_id" : ObjectId("5b0cf3b77f8b9a0a1330f26s"),
"group" : ObjectId("5b0cf3b77f8b9a0a1330f27f"),
"referrers" : [
{
"referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20c"),
"canAddUser" : true
},
{
"referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20d"),
"canAddUser" : true
},
{
"referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20e"),
"canAddUser" : true
}
]
Как мне запустить запрос, чтобы обновить это сразу в нескольких документах?
Вы можете использовать оператор $ [] позиционное все (MongoDB 3.6+) для обновления всех элементов в массиве и multi: true
для обновления всех документов.
db.col.update({}, { $set: { "referrers.$[].canAddUser": true } }, { multi: true })
Для более низких версий MongoDB вы можете использовать $ addFields для перезаписи существующего поля и $ вне для перезаписи существующей коллекции:
db.colname.aggregate([
{
$addFields: {
referrers: {
$map: {
input: "$referrers",
as: "r",
in: { referrer_id: "$$r.referrer_id", canAddUser: true }
}
}
}
},
{
$out: "colname"
}
])
Извините, я получил ожидаемый результат :-) Большое спасибо
Как найти позицию? Не могли бы вы объяснить мне приведенный выше пример?