我的查询与更新以数组形式存储的多个子文档有关。
环境:我已经在计算机上安装了MongoDB Shell版本v3.6.3,python 3.6.9和pymongo 3.6.1。
架构示例:
dept : { "_id" : 1, "dept_name" : "paper", "dept_projs" : 2534, "dept_city" : "Pimpri-Chinchwad",
"emps": [
{ "salary" : 10000, "city" : "Ajmer", "_id" : 1111, "emp_name" : "Jessica Ali" } ,
{ "salary" : 12000, "city" : "Dhanbad", "_id" : 1112, "emp_name" : "Samuel Sanchez" },
{ "salary" : 8000, "city" : "Gwalior", "_id" : 1113, "emp_name" : "Willie Little" } ,
...
]
}
查询:我想更新存储在数组中的选定多个子文档。当我在mongodb单元格中编写此查询时,它可以工作。但是,Python3向我显示了错误。
db.dept.update({"emps._id":{"$gte":1111,"$lte":1114}},{"$inc":{"emps.$[idx].salary" : 20000}},{"arrayFilters":[{"idx._id":{"$gte":1111, "$lte":1114}}],multi:true})
错误:"TypeError: upsert must be True or False"
用于Python代码 **结果
E=db.dept.update({"emps._id":{"$gte":1111,"$lte":1114}},{"$inc":{"emps.$[idx].salary" :20000}},{"arrayFilters":[{"emps._id":{"$gte":1111,"$lte":1114}}],"multi":True})**
错误:pymongo.errors.OperationFailure: BSON field 'update.updates.multi' is the wrong type 'object', expected type 'bool'
用于python代码 **结果
E=db.dept.update({"emps._id":{"$gte":1111,"$lte":1114}},{"$inc":{"emps.$[idx].salary" : 20000}},False, True,{"arrayFilters":[{"emps._id":{"$gte":1111,"$lte":1114}}]})**
答案 0 :(得分:0)
您应该这样写您的请求:
db.dept.update({"emps._id" : {"$gte" : 1111, "$lte" : 1114}}, {"$inc" : {"emps.$[idx].salary" : 20000}}, {"arrayFilters" : [{"idx._id" : {"$gte" : 1111, "$lte" : 1114}}], multi=True})
注意:我只提供了语法更正,与pymongo中ArrayFilters的问题有关。
答案 1 :(得分:0)
如果查看pymongo
的源代码,您会发现update
函数不会收到有关arrayFilters
的任何参数,因此必须使用{{1} },它将接受名为update_one
的可选参数:
array_filters