Python mongodb批量修改数据库某个字段

数据库集合中有个字段是短信价格(单价*计费条数),经常会需要修改历史短信价格,由于数据量比较大(百万或者千万级别),for循环一条一条更新则速度非常慢。可使用下面脚本批量更新:

python 复制代码
from pymongo import MongoClient, UpdateOne

# ------------------ 配置 MongoDB ------------------
username = "xxxx"
password = "xxxx"
host = "172.16.xxx.xxx"
port = 27017
db_name = "sms"
collection_name = "sms_record"

client = MongoClient(
    host=host,
    port=port,
    username=username,
    password=password,
    authSource=db_name
)

db = client[db_name]
smsRecord = db[collection_name]

# ------------------ 查询条件 ------------------
startPt = "20260101"
endPt = "20260107"
appId = 123456
query = {"pt": {'$gte': startPt, "$lte": endPt}, "appId": appId}

# ------------------ 批量更新设置 ------------------
batch_size = 1000  # 每批处理多少条
operations = []
updated_count = 0
smsPrice = 0.03  # 标准单价

# ------------------ 遍历并准备批量操作 ------------------
for item in smsRecord.find(query, no_cursor_timeout=True):
    sid = item['sid']
    amount = item['amount']
    fee = item['fee']
    
    if float(fee) / float(amount) == smsPrice:
        continue  # 已是标准单价,不需要更新

    print(item)
    new_fee = smsPrice * amount
    operations.append(UpdateOne({'sid': sid}, {'$set': {'fee': new_fee}}))
    updated_count += 1

    # 达到批量大小就提交一次
    if len(operations) >= batch_size:
        smsRecord.bulk_write(operations)
        print(f"已更新 {updated_count} 条记录")
        operations = []

# ------------------ 提交剩余未提交的操作 ------------------
if operations:
    smsRecord.bulk_write(operations)
    print(f"已更新 {updated_count} 条记录")

print(f"批量更新完成,总共更新 {updated_count} 条记录")
相关推荐
m0_466525297 分钟前
绿盟科技风云卫AI安全能力平台成果重磅发布
大数据·数据库·人工智能·安全
java干货11 分钟前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
机器懒得学习13 分钟前
智能股票分析系统
python·深度学习·金融
毕设源码-郭学长13 分钟前
【开题答辩全过程】以 基于python的二手房数据分析与可视化为例,包含答辩的问题和答案
开发语言·python·数据分析
SR_shuiyunjian16 分钟前
Python第三次作业
python
vx_biyesheji000117 分钟前
豆瓣电影推荐系统 | Python Django 协同过滤 Echarts可视化 深度学习 大数据 毕业设计源码
大数据·爬虫·python·深度学习·django·毕业设计·echarts
鸽芷咕42 分钟前
DrissionPage 成 CANN 仓库爆款自动化工具:背后原因何在?
运维·python·自动化·cann
爱学习的阿磊44 分钟前
使用Fabric自动化你的部署流程
jvm·数据库·python
枷锁—sha1 小时前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
惜分飞1 小时前
ORA-600 kcratr_nab_less_than_odr和ORA-600 4193故障处理--惜分飞
数据库·oracle