示例文档
{
_id: 4,
grades: [
{ grade: 80, mean: 75, std: 8 },
{ grade: 85, mean: 90, std: 5 },
{ grade: 90, mean: 85, std: 3 }
]
}
使用数组过滤器 arrayFilters
用于精确控制更新的数组元素,尤其适合批量更新。
语法示例:将所有文档的grades数组中,grade字段等于90的对象的std字段更新为4。
db.students.updateMany(
{}, // 查询条件:匹配所有文档
{ $set: { "grades.$[elem].std" : 4 } }, // 更新操作:'$[elem]'为占位符
{ arrayFilters: [ { "elem.grade": 90 } ] } // 过滤器:定义'elem'指代的是grade为90的对象
)
关键点:
arrayFilters选项需要作为第三个参数传入。
占位符(如elem)的名字可以自定义,但需与arrayFilters中的标识符一致。
可以设置更复杂的条件,例如 { "elem.grade": { $gte: 85 } }来更新所有grade大于等于85的对象。
pymongo写法:
from pymongo import MongoClient
# 连接 MongoDB
client = MongoClient('mongodb://localhost:27017/')
db = client['your_database_name']
collection = db['students']
# 使用 update_many 和 array_filters
result = collection.update_many(
{}, # 过滤条件:匹配所有文档
{"$set": {"grades.$[elem].std": 4}}, # 更新操作
array_filters=[{"elem.grade": 90}] # 数组过滤器:注意参数名为 array_filters
)
print(f"匹配到的文档数: {result.matched_count}")
print(f"修改了的文档数: {result.modified_count}")
PyMongo 中参数名称是 array_filters
7170

被折叠的 条评论
为什么被折叠?



