python - 更新与 mongodb 中的查询匹配的多个数组元素
问题描述
我正在使用 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)
任何帮助,将不胜感激 。谢谢
解决方案
您需要使用位置运算符 + arrayFilters 如下:
蒙哥壳:
db.test.updateMany( {"doc.assessmentId":115513, "doc.institutionId":1632 } ,{"$set":{"doc.subjects.$[fs].Rank":0}},{arrayFilters:[{"fs.Included":false} ]} )
Python:
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
推荐阅读
- jmeter - 请保护ChromeDriver及相关测试框架使用的端口,防止恶意代码访问
- javascript - 是否可以仅使用 HTML 和服务器端(节点)js 在 Node/Express 中发出发布请求?
- google-cloud-platform - Firebase 存储错误:权限被拒绝。无法访问存储桶 my-bucket-name
- django - 没有名为“频道”的模块
- excel - EXCEL中每个单元格中受限部分的条件格式
- java - 泛型有界参数不适用于接口
- android - Flutter:当我使用 full_pdf_viewer 时我的应用程序停止
- java - 未在 Java 输出中键入 WSDL 数组复杂类型
- javascript - 将音频 blob 的 AJAX 请求发送到异步 API
- nginx - nginx重定向到子域,这是另一个域的代理