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" 

Добавить комментарий