Mongo批量处理数据的思路
mongo数据库中已经采集了2000W的数据,现在需要对每条数据进行一定的处理,如何设计处理思路?
逐条处理
一开始选择的定义一个状态字段 _Status, 默认等于0, 通过find_one_and_update 的方式逐一进行处理,这样处理的弊端也是很明显的:
1. 逐一处理,速度较慢
2. 大量的查询会占用更多的数据库资源
批量处理
使用mongo中的limit的方式批量获取数据,更新最后一次获取到的数据的_id,为了保证数据不被漏掉,我们对_id进行排序, 代码如下:
import pymongo
from bson import ObjectId
class RepairDemo:
def __init__(self):
# 数据库参数自行定义
self.mongo_client = pymongo.MongoClient(MONGO_URL)
self.mongo_db = self.mongo_client[MONGO_DB_NAME]
self.mongo_table = self.mongo_db[MONGO_TABLE_NAME]
# 初始化_id
self.start_id = ObjectId("000000000000000000000000")
# 批量处理数据时每次处理的数据量
self.limit_number = 2000
# 已经处理的数据条目
self.counter = 0
def repair(self, item):
"""
处理数据的逻辑方法
"""
pass
def main(self):
while True:
# 获取到游标对象
cursor = self.mongo_table.find({"_id": {"$gt": self.start_id}}).sort("_id").limit(self.limit_number)
# 通过游标加载数据
r = list(cursor)
# 数据列表为空,则数据处理完毕
if not r:
break
# 逐一处理数据
for item in r:
self.repair(item)
self.counter += 1
# 重置起始_id
self.start_id = r[-1]["_id"]
# 打印一些信息
print("Repaired number=%d, last_id=%s" % (self.counter, self.start_id))
print("Repair End, total repair number=%d" % self.counter)