【笔记】mongodb数组对象条件更新方法

示例文档

{
  _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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值