How to Update Multiple Array Elements in mongodb

Suppose we have collection of documents having array and we want to update document having array on the basis of some condition.

Insert document in movies collection

db.movies.insertMany([
  {
    title: "Phone Bhoot",
    actors: [
      { age: 30, sex: "f", name: "n" },
      { age: 20, sex: "f", name: "c" },
      { age: 35, sex: "m", name: "s" },
      { age: 40, sex: "m", name: "a" },
    ],
  },
  {
    title: "Sita Raman",
    actors: [
      { age: 30, sex: "m", name: "se" },
      { age: 20, sex: "f", name: "cn" genre:['action', 'romance', 'thrill', 'suspence]},
      { age: 25, sex: "f", name: "sn" },
      { age: 30, sex: "m", name: "an" },
    ],
  },
  {
    title: "Bharamsastra",
    actors: [
      { age: 50, sex: "m", name: "ser" genre:['family', 'thrill']},
      { age: 40, sex: "f", name: "cnr" },
      { age: 25, sex: "f", name: "snr" },
      { age: 30, sex: "m", name: "anr" , genre:['action', 'romance', 'thrill']},
    ],
  },
]);

The $[<identifier>] operator facilitates updates to arrays that contain embedded documents. To access the fields in the embedded documents, use the dot notation with the $[<identifier>].

db.collection.updateMany(
   { <query selector> },
   { <update operator>: { "array.$[<identifier>].field" : value } },
   { arrayFilters: [ { <identifier>: <condition> } } ] }
)

Example 1: Increment age by 5 where tilte “Phone Bhoot” and age less than 30

db.movies.updateMany(
  { title: "Phone Bhoot" },
  { $inc: { "actors.$[elem].age": 5 } },
  { arrayFilters: [{ "elem.age": { $lt: 30 } }] }
);

Example 2: set “senior” to “yes”, those age greater than 50

db.movies.updateMany(
  {},
  { $set: { "actors.$[elem].senior": "yes" } },
  { arrayFilters: [{ "elem.age": { $gt: 40 } }] }
);

Example 3: set “diva” to “yes”, those age greater than equal 20 and less than equal to 30 and sex is f

db.movies.updateMany(
  {},
  { $set: { "actors.$[elem].diva": "yes" } },
  { arrayFilters: [{ "elem.age": { $gt: 18, $lte: 30 }, "elem.sex": "f" }] }
);

Example 4: add “action” to genre whose age greater than equal 20 and less than equal to 30 and sex is m

db.movies.updateMany(
  {},
  { $push: { "actors.$[elem].genre": "action" } },
  { arrayFilters: [{ "elem.age": { $gte: 20, $lte: 30 }, "elem.sex": "m" }, ] }
);

How it works ?

The filtered positional operator $[<identifier>] identifies the array elements that match the arrayFilters conditions for an update operation, Used in conjunction with the arrayFilters option, the $[<identifier>] operator has the following form:

{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }

The <identifier> must begin with a lowercase letter and contain only alphanumeric characters.

Few other posts from Mongo DB

Source : MongoDB Doc

Leave a Reply