Для обновления существующих объектов массива и добавления новых в 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
.