Mongodb循环整个数据库进行数据处理,应用场景,有时候需要对整个数据库进行数据处理,需要读取整个数据库,如果数据量较大,一次性读取则会卡机,所以还是需要分页读取后进行处理,这里写一段分页处理mongodb数据的思路,分享给大家,铭记:方法不是唯一,效果却是一样。技术不是用来炫,最新版本不一定是最好的,稳定才是王道。
import random from bson.objectid import ObjectId import pymongo import re from common.mongodatahelper import MongoDBHelper import time # 设置socket的超时时间,解决一直卡住的问题 import socket socket.setdefaulttimeout(10) # 全局变量 password='' dbname='' dbper = MongoDBHelper(host='主机名',port=端口,username=dbname,password=password,authsource=dbname,databasename=dbname)
# 开始 maxid=None tablename='search' # 循环每个表 while True: contentlist=[] if maxid: # 存在maxid cdtm1=dbper.CurdDataToMongo(content=None,tablename=tablename,myquery={'_id':{'$gt':maxid}},curd='r',limit=100,sort=[('_id',pymongo.ASCENDING)]) if cdtm1 and cdtm1[0]==0 and type(cdtm1[1])==list and len(cdtm1[1])>0: for item1617 in cdtm1[1]: if maxid<item1617['_id']: maxid=item1617['_id'] contentlist=cdtm1[1] else: break else: # 第一次不存在maxid cdtm1=dbper.CurdDataToMongo(content=None,tablename=tablename,myquery=None,curd='r',limit=1,sort=[('_id',pymongo.ASCENDING)]) if cdtm1 and cdtm1[0]==0 and type(cdtm1[1])==list and len(cdtm1[1])>0: maxid=cdtm1[1][0]['_id'] contentlist=cdtm1[1] else: print('此表无数据,talbename={}'.format(tablename)) break if contentlist: for item1639 in contentlist: num+=1 id=item1639['_id'] title=item1639['title']