MongoDB: Обновление массивов в документах
Вы можете использовать методы updateOne() или updateMany() для добавления, обновления или удаления элементов массива на основе указанных критериев. Для обновления нескольких массивов в коллекции рекомендуется использовать updateMany()
Чтобы продемонстрировать операцию обновления, вставьте в коллекцию следующие образцы документовemployees
.
db.employees.insertMany([
{
_id:1,
firstName: "John",
lastName: "King",
email: "[email protected]",
salary: 5000,
skills: [ "Angular", "React", "MongoDB" ]
},
{
_id:2,
firstName: "Sachin",
lastName: "T",
email: "[email protected]",
salary: 8000,
skills: [ "Accounting", "Tax" ]
},
{
_id:3,
firstName: "James",
lastName: "Bond",
email: "[email protected]",
salary: 7500,
skills: [ "Sales", "Marketing" ]
},
{
_id:4,
firstName: "Steve",
lastName: "J",
email: "[email protected]",
salary: 7000,
skills: [ "Mac", "Marketing", "Product Design" ]
},
{
_id:5,
firstName: "Kapil",
lastName: "D",
email: "[email protected]",
salary: 4500,
skills: [ "Accounting", "Tax", "Sales" ]
},
{
_id:6,
firstName: "Amitabh",
lastName: "B",
email: "[email protected]",
salary: 7000,
skills: [ "Marketing", "Tax" ]
}
])
Перезапись массивов
Оператор $set
перезаписывает указанный массив вместо добавления, удаления и обновления элементов массива.
db.employees.updateMany({_id:5},{$set:{ skills:["Sales Tax"]}})
Результат:
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}
В приведенном выше примере {$set:{ skills:["Sales Tax"]}}
перезаписывает существующий массив for {_id:5}
.
db.employees.find({_id:5})
Результат:
{
_id: 5,
firstName: 'Kapil',
lastName: 'D',
email: '[email protected]',
salary: 4500,
skills: [ 'Sales Tax' ],
department: { name: 'Finance' },
location: 'USA'
}
Обновление элементов массива
Используйте операторы для обновления одного или нескольких элементов массивов в MongoDB.
Следующее обновит «Marketing» до «Public Speaking» в поле skills
массива для всех документов.
db.employees.updateMany(
{skills:"Marketing"},
{$set:{"skills.$":"Public Speaking"}})
Результат:
{
acknowledged: true,
insertedId: null,
matchedCount: 2,
modifiedCount: 2,
upsertedCount: 0
}
В приведенном выше примере, {skills:"Marketing"}
задает критерии для поиска всех документов, в которых skills
массив содержит элемент "Marketing"
.
Второй параметр {$set:{"skills.$":"Public Speaking"}})
задает значение для обновления с помощью $set
оператора. {"skills.$":"Public Speaking"}
Указывает обновить элемент до «Public Speaking». $
Это оператор массива, который действует как заполнитель для первого совпадения документа в запросе обновления.
db.employees.updateMany(
{},
{ $set: {"skills.$[element]":"GST"}},
{ arrayFilters: [{ element: "Tax" }]})
Результат:
{
acknowledged: true,
insertedId: null,
matchedCount: 6,
modifiedCount: 2,
upsertedCount: 0
}
В приведенном выше примере, { $set: {"skills.$[element]":"GST"}},{ arrayFilters: [{ element: "Tax" }]}
обновляет массив skills
, если он содержит элемент «Tax», а затем обновляет его до «GST». {"skills.$[element]":"GST"}}
указывает обновить элемент до «GST» и arrayFilters
задает критерии для элементов массива. { arrayFilters: [{ element: "Tax" }]}
Указывает, что найти элемент массива, значение которого равно «Tax». Таким образом, updateMany()
метод обновит элементы массива значением, указанным в$set
, и для соответствующих элементов, указанных в arrayFilters
.
Добавление нового элемента в массивы
Используйте оператор $push
для добавления новых элементов в массивы. Следующее добавит "Sports"
элемент во все массивы.
db.employees.updateMany(
{},
{$push:{"skills":"Sports"}}) // add "Sports" to all arrays
db.employees.updateMany(
{_id:3},
{$push:{"skills":"Sports"}}) // add "Sports" element to skills array where _id:3
Используйте $each
оператор для указания нескольких элементов, которые необходимо добавить в массивы.
db.employees.updateMany(
{},
{$push:{"skills":{$each:["Sports","Acting"]}}}) // adds "Sports" and "Acting" to all arrays
В приведенном выше примере {$each:["Sports","Acting"]}
указывается массив для добавления нескольких элементов.
Используйте $addToSet
оператор для добавления элемента, если он еще не существует.
Следующее будет добавлено "GST"
к массиву skills
во всех документах, если он не существует.
db.employees.updateMany(
{},
{ $addToSet: {"skills":"GST"} }) // adds "GST"to all arrays if not exist
Удаление Первого или Последнего элемента из массивов
Используйте $pop
оператор для удаления первого или последнего элемента из массивов. Укажите 1, чтобы удалить последний элемент, и -1, чтобы удалить первый элемент.
db.employees.updateMany(
{},
{$pop:{"skills":1}}) // removes the last element
db.employees.updateMany(
{},
{$pop:{"skills":-1}}) //removes the first element
db.employees.updateMany(
{},
{$pull: { "skills": "GST" }}) // removes "GST"