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
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;ie, "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
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.