How to update an object in a array using MongoDB Java Driver?

Viewed 3874

Hello I have this document

{
  email: "email@gmail.com",
  list: [
    {
      "product": "Car",
      "price": 18
    },
    {
      "product": "Boat",
      "price": 20 
    }
  ]
}

I am wondering how to identify the document using the email parameter and update a specific object in the list parameter by finding the product with the "Car" parameter and updating the price to 15 using the MongoDB Java Driver.

Thank you

1 Answers

There are two ways to update the nested document of an array field based upon a condition.

(1) Update using the Positional $ Operator:

The positional $ operator acts as a placeholder for the first element that matches the query document, and the array field must appear as part of the query document;i.e., "list.product": "Car". And, secondly only the first matching array element will be updated.

db.collection.updateOne( 
  { email: "email@gmail.com", "list.product": "Car" }, 
  { $set: { "list.$.price": 15 } } 
)

(2) Update using the Filtered Positional $[identifier] Operator:

The filtered positional operator $[identifier] identifies the array elements that match the arrayFilters conditions for an update operation.

Note the condition on the array field is not required when using the $[identifier] update operator. And, secondly all the matching array elements ("product": "Car") will be updated.

db.collection.updateOne( 
  { email: "email@gmail.com" }, 
  { $set: { "list.$[ele].price": 15 } },
  { arrayFilters: [ { "ele.product": "Car" } ] }
)


Update using MongoDB Java Driver:

Case 1:

Bson filter = and(eq("email", "email@gmail.com"), eq("list.product", "Car"));
Bson update = set("list.$.price", 15);
UpdateResult result = coll.updateOne(filter, update);

Case 2:

Bson filter = eq("email", "email@gmail.com");
UpdateOptions options = new UpdateOptions()
                              .arrayFilters(asList(eq("ele.product", "Car")));
Bson update = set("list.$[ele].price", 15);
UpdateResult result = coll.updateOne(filter, update, options);

Reference: MongoDB Java Driver

Related