Обновление вложенных документов в массивах MongoDB выполняется с использованием оператора $ и, для более сложных случаев, оператора $elemMatch. Рассмотрим два подхода: без $elemMatch и с его применением.
Обновление без оператора $elemMatch
Пример массива с вложенными документами: card — массив, содержащий два вложенных документа. Каждый вложенный документ имеет поля title, price и quantity.
Необходимо изменить второй документ, где title равен «phone», и значение поля quantity.
Запрос:
db.collection.updateOne(
{ "card.title": "phone" },
{ $set: { "card.$[].quantity": 2 } }
)
Описание:
- {"card.title": "phone"} — условие поиска документа, где поле title вложенного документа равно «phone».
- $set — оператор для изменения значения поля.
- "card.$[].quantity" — $ указывает на индекс найденного поддокумента. Обращение к полю quantity этого поддокумента и установка его значения в 2.
Обновление с добавлением и обновлением документов
Сначала добавим cardId к документу, а затем два вложенных документа в массив card, после чего обновим один из них.
- Добавление cardId:
db.collection.updateOne( { "_id": 5 }, // Замените 5 на ваш id { $set: { "cardId": 456 } } )
- Добавление вложенных документов:
Используем оператор $push с модификатором $each:
db.collection.updateOne( { "cardId": 456 }, { $push: { card: { $each: [ { title: "TV" }, { title: "phone" } ] } } } )
- Обновление существующего вложенного документа:
Обновляем первый вложенный документ (с title: "TV"):
db.collection.updateOne( { "cardId": 456, "card.title": "TV" }, { $set: { "card.$[].price": 340, "card.$[].quantity": 2 } } )
Аналогично обновляем второй документ (с title: "phone"), изменив price и quantity.
Использование оператора $elemMatch
Для сопоставления вложенных документов по нескольким полям (например, title и price), используется оператор $elemMatch. $elemMatch в запросе позволяет найти вложенный документ, удовлетворяющий нескольким условиям, и затем обновить его. Более подробное описание этого метода будет представлено дополнительно.
Рассмотрены способы обновления вложенных документов в MongoDB, используя оператор $ для указания индекса вложенного документа и оператор $set для изменения значений полей. Для поиска по нескольким полям вложенных документов используется оператор $elemMatch.