Вставить новый элемент во весь документ коллекции во вложенный массив

У меня есть документ вроде

"_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
    }
]

Как мне запустить запрос, чтобы обновить это сразу в нескольких документах?

1
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать оператор $ [] позиционное все (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"
    }
])

Как найти позицию? Не могли бы вы объяснить мне приведенный выше пример?

Nishanth G 10.09.2018 08:20

Извините, я получил ожидаемый результат :-) Большое спасибо

Nishanth G 10.09.2018 08:41

Другие вопросы по теме