Mongo批量处理数据的思路

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
            # 打印一些信息
            print("Repaired number=%d" % self.counter)
            # 重置起始_id
            self.start_id = r[-1]["_id"]
        print("Repair End, total repair number=%d" % self.counter)
        

你可能感兴趣的:(mongo,python,mongodb)