Как обновить существующие объекты массива и добавить новые при обновлении документа?

Для обновления существующих объектов массива и добавления новых в MongoDB при обновлении документа, можно использовать операторы обновления, такие как $set и $push.

Начнем с обновления существующих объектов массива. Предположим, у нас есть коллекция users со следующим документом:

{
  _id: ObjectId("5eac4b76fc13ae3a7ca56f3a"),
  name: "John",
  hobbies: [
    { name: "reading", level: "beginner" },
    { name: "painting", level: "advanced" }
  ]
}

Чтобы обновить значения внутри массива hobbies, мы можем использовать оператор $set. Допустим, мы хотим обновить уровень знаний по чтению с "beginner" на "intermediate". Мы можем использовать следующий запрос:

db.users.update(
  { _id: ObjectId("5eac4b76fc13ae3a7ca56f3a") },
  { $set: { "hobbies.$[elem].level" : "intermediate" } },
  { arrayFilters: [{ "elem.name": "reading" }] }
)

Здесь, $[elem] служит фильтром для идентификации элементов массива hobbies, в которых поле name равно "reading". Затем оператор $set обновляет поле level этого найденного элемента.

Теперь рассмотрим добавление новых объектов в массив при обновлении документа. Предположим, у нас есть следующая коллекция users:

{
  _id: ObjectId("5eac4b76fc13ae3a7ca56f3b"),
  name: "Jane",
  hobbies: [
    { name: "gaming", level: "intermediate" }
  ]
}

Мы хотим добавить новую хобби - "cooking". Мы можем использовать оператор $push для добавления нового объекта в массив hobbies. Вот пример запроса:

db.users.update(
  { _id: ObjectId("5eac4b76fc13ae3a7ca56f3b") },
  { $push: { hobbies: { name: "cooking", level: "beginner" } } }
)

Этот запрос добавляет новый объект { name: "cooking", level: "beginner" } в массив hobbies в документе с _id равным "5eac4b76fc13ae3a7ca56f3b".

Важно отметить, что при использовании оператора $push будет добавлен новый объект только в том случае, если поле с таким названием еще не существует. Если же поле уже существует и мы хотим обновить его значение, следует использовать оператор $set.

Таким образом, для обновления существующих объектов массива и добавления новых при обновлении документа в MongoDB, можно использовать операторы $set и $push.