你好,我有这份文件
{
email: "email@gmail.com",list: [
{
"product": "Car","price": 18
},{
"product": "Boat","price": 20
}
]
}
我想知道如何使用email
参数识别文档并通过找到 product 来更新list
参数中的特定对象使用“汽车”参数,并使用MongoDB Java驱动程序将 价格 更新为15。
谢谢
你好,我有这份文件
{
email: "email@gmail.com",list: [
{
"product": "Car","price": 18
},{
"product": "Boat","price": 20
}
]
}
我想知道如何使用email
参数识别文档并通过找到 product 来更新list
参数中的特定对象使用“汽车”参数,并使用MongoDB Java驱动程序将 价格 更新为15。
谢谢
有两种方法可以根据条件更新数组字段的嵌套文档。
(1)使用位置$运算符更新:
positional $ operator充当与查询文档匹配的第一个元素的占位符,并且数组字段必须显示为查询文档的一部分;即"list.product": "Car"
。而且,第二,只有第一个匹配的数组元素将被更新。
db.collection.updateOne(
{ email: "email@gmail.com","list.product": "Car" },{ $set: { "list.$.price": 15 } }
)
(2)使用过滤的位置$ [identifier]运算符进行更新:
filtered positional operator $[identifier]标识与arrayFilters
条件匹配的数组元素以进行更新操作。
请注意,在使用$[identifier]
更新运算符时,不需要在数组字段上指定条件。然后,所有匹配的数组元素("product": "Car"
)将被更新。
db.collection.updateOne(
{ email: "email@gmail.com" },{ $set: { "list.$[ele].price": 15 } },{ arrayFilters: [ { "ele.product": "Car" } ] }
)
使用MongoDB Java驱动程序更新:
案例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);
案例2:
Bson filter = eq("email","email@gmail.com");
UpdateOptions options = new UpdateOptions()
.arrayFilters(asList(eq("ele.product","Car")));
Bson update = set("list.$[ele].price",update,options);