{
"Department" : "PE",
"Staff" : [
{
"Name" : "Allen",
"Designation" : "Application Developer",
"Leaves" : 10
},
{
"Name" : "Allen",
"Designation" : "Product Developer",
"Leaves" : 10
},
{
"Name" : "Billy",
"Designation" : "Product Developer",
"Leaves" : 10
},
{
"Name" : "Bob",
"Designation" : "Application Developer",
"Leaves" : 10
},
{
"Name" : "Bob",
"Designation" : "Product Developer",
"Leaves" : 10
},
{
"Name" : "Jim",
"Designation" : "Application Developer",
"Leaves" : 10
},
{
"Name" : "Han",
"Designation" : "Salesforce Developer",
"Leaves" : 10
}
]
}
我有一个文档与MongoDB的上述结构。我试图将Leaves
值更新为15,指定为应用程序开发人员和产品开发人员。我试过这个查询
updateOne({'$and': [{"Department" : "PE"}, {'Staff.Name': Name}, {'Staff.Designation': Designation}]},{"$set": {'Staff.$.Leaves': 15}}, upsert=True)
或
updateOne({"Department" : "PE", 'Staff.Name': Name, 'Staff.Designation': Designation},{"$set": {'Staff.$.Leaves': 15}}, upsert=true)
Output:
updated:2 {
"Name" : "Allen",
"Designation" : "Application Developer",
"Leaves" : 15
},
{
"Name" : "Allen",
"Designation" : "Product Developer",
"Leaves" : 15
}
Not updated: 5
我尝试了以下查询:
updateOne({'$and': [{"Department" : "PE"}, {'Staff.Name': Name}, {'Staff.Designation': Designation}]},{"$set": {'Staff.$[].Leaves': 15}}, upsert=true) --> Throwing exception
updateOne({'$and': [{"Department" : "PE"}, {'Staff.Name': Name}, {'Staff.Designation': Designation}]},{"$push": {'Staff.$.Leaves': 15}}, upsert=true) --> Not working
updateOne({'$elemMatch': {"Department" : "PE", 'Staff.Name': Name, 'Staff.Designation': Designation}},{"$set": {'Staff.$.Leaves': 15}}, upsert=true) --> Throwing exception
您需要使用arrayFilters,经过筛选的位置操作符$[<identifier>]
识别符合更新操作的arrayFilters条件的数组元素,
updateOne(
{ "Department": "PE" },
{
"$set": {
"Staff.$[s].Leaves": 15
}
},
{
arrayFilters: [
{
"s.Designation": {
$in: ["Application Developer", "Product Developer"]
},
"s.Name": "Allen"
}
],
upsert: true
}
)
游乐场