【问题标题】:Pymongo error for ArrayFilters to update multiple subdocumentsArrayFilters 更新多个子文档的 Pymongo 错误
【发布时间】:2020-07-06 18:47:00
【问题描述】:

我的查询是关于更新以数组形式存储的多个子文档。

环境:我的电脑已经安装了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}}]})**

【问题讨论】:

  • 你解决了吗?

标签: mongodb pymongo


【解决方案1】:

如果你查看pymongo的源代码,你会发现update函数不会接收任何关于arrayFilters的参数,所以你必须使用update_one,它会接受一个可选参数命名为array_filters:

db.dept.update_one(
    {"emps._id" : {"$gte" : 1111, "$lte" : 1114}},
    {"$inc" : {"emps.$[idx].salary" : 20000}}, 
    upsert=True,
    array_filters=[{"idx._id" : {"$gte" : 1111,  "$lte"  : 1114}}]
)

【讨论】:

    【解决方案2】:

    你应该这样写你的请求:

    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 的问题有关。

    【讨论】:

      猜你喜欢
      • 2014-10-24
      • 2018-04-23
      • 2012-12-03
      • 2020-04-20
      • 2021-06-22
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      相关资源
      最近更新 更多