MongoDB updateOne() and $set:{}


{
"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
}
)

游乐场

最新更新