【问题标题】:update multiple array elements matching a query in mongodb更新与 mongodb 中的查询匹配的多个数组元素
【发布时间】:2021-04-16 03:15:39
【问题描述】:

我正在使用 python 代码更新与查询匹配的数组中的多个元素。这是我的文档结构:

    doc: {
    "userId":327238,
    "assessmentId":115513,
    "institutionId":1632,
    "subjects":[
        {"Id":238,"Included":false,"Rank":1},
        {"Id":239,"Included":true,"Rank":4},
        {"Id":240,"Included":false,"Rank":1},
        {"Id":241,"Included":true,"Rank":10}
     ]
   }

我想仅为具有“包含”的数组元素设置“排名”:0:假。我已经尝试了下面的代码,但它为所有数组元素设置了 'Rank':0。

 query = {"assessmentId":115513, "institutionId":1632, "subjects":{"$elemMatch":{"Included":false}}}
 update = {"$set":{"subjects.$[].Rank":0}}
 db.test.update_many(query, update)

任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: python arrays mongodb pymongo


    【解决方案1】:

    你需要使用位置运算符 + arrayFilters 如下:

    mongo 外壳:

    db.test.updateMany( {"doc.assessmentId":115513, "doc.institutionId":1632 } ,{"$set":{"doc.subjects.$[fs].Rank":0}},{arrayFilters:[{"fs.Included":false} ]}  )
    

    蟒蛇:

    query={"doc.assessmentId":115513, "doc.institutionId":1632 }
    update={"$set":{"doc.subjects.$[fs].Rank":0}}
    db.test.update_many( query ,update,array_filters=[{"fs.Included":False} ]  )
    

    解释: 您在 arrayFilter 中定义变量 fs.Included:false 将用于匹配更新 $set 阶段中的数组对象,并且只有匹配的数组对象的 Rank 设置为 0

    【讨论】:

    • 上述查询出现错误 - raise TypeError("%s must be True or False" % (option,)) TypeError: upsert must be True or False
    • 在 mongo shell 中直接测试可以正常工作,因为 pymongo 驱动程序可能会有所不同,您能否准确添加您在 python 中运行的内容以及您使用的 python 版本 + pymongo 驱动程序?
    • python 版本 - 3.8.3,pymongo 版本 - 3.10.1
    • 这是我在 python 脚本中运行的命令 - query = {"assessmentId":115513, "institutionId":1632, "subjects":{"$elemMatch":{"Included":错误}}} update = {"$set":{"subjects.$[].Rank":0}} db.test.update_many(query, update)
    • 根据您的建议,我已将命令更改为此 - db.test.update_many({"assessmentId":115513, "institutionId":1632}, {"$set":{"subjects. $[fs].Rank":0}}, {'arrayFilters':[{"fs.Included":False}]})
    猜你喜欢
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多