MongoDB: Обновление вложенных документов с $

Обновление вложенных документов в массивах 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, после чего обновим один из них.

  1. Добавление cardId:

    db.collection.updateOne(
      { "_id": 5 }, // Замените 5 на ваш id
      { $set: { "cardId": 456 } }
    )
  2. Добавление вложенных документов:

    Используем оператор $push с модификатором $each:

    db.collection.updateOne(
      { "cardId": 456 },
      { $push: { card: { $each: [ { title: "TV" }, { title: "phone" } ] } } }
    )
  3. Обновление существующего вложенного документа:

    Обновляем первый вложенный документ (с 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.

Что будем искать? Например,программа