Pandas读取MongoDB数据的另一种方式

之前介绍了在Pandas中读取MongoDB数据的方法,在索引出数据之后,将结果转换为列表list,然后在传入一个pandas的DataFrame中。

import pymongo import pandas as pd  # 设置MongoDB连接信息 client = pymongo.MongoClient('localhost',27017) cn_78 = client['cn_78'] project_info = cn_78['project_info']  data = pd.DataFrame(list(project_info.find())) # 删除mongodb中的_id字段 del data['_id'] # 选择需要显示的字段 data = data[['aear','cate','subcate','name','maxmoney','minmoney','time']] print(data) 

这种方法很简单,但是有一个问题,就是在数据量大的时候,会大量的占用内存以及耗费时间,如果在内存不大的单机上进行操作,可能因为内存而导致主机崩溃。所以只适合少量数据下的使用。

今天介绍一个适合大量数据的方法,没有使用list列表转换来得方便,但是快速以及占用机器内存小。

第一步,编写好查询语句:

import pymongo import pandas as pd import csv  df = data.find(         {             'pay_time':{'regex':'2014-.*'},             'shop_name':'官方旗舰店',             'status':'已确认',            'or':[ {'pro_name':{'regex':'.*特价.*'}},{'pro_name':{'regex':'.*促销.*'}},{'pro_name':{'$regex':'.*优惠.*'}}]         },         {             '_id':0,         }     ) 

第二步,新建一个csv文件,遍历mongoDB的查询,并写入csv文件中:

with open('data.csv','w',encoding='utf-8',newline='') as files:     csvfiles = csv.DictWriter(files,fieldnames=['pay_time','send_num'])     csvfiles.writeheader()     n = 1     for i in df:     # print(i)         print('第{0}条'.format(n))         csvfiles.writerow({'pay_time':i['pay_time'],'send_num':i['send_num']})         n += 1 

第三步,使用pandas进行读取
使用pandas读取csv文件直接使用read_csv()方法即可。

data = pd.read_csv('data.csv') 

或是留作他用。

虽然需要进行三个步骤,但是在查询数据量大的情况下,所消耗的时间并不比直接进行list转换要多,多数情况下,都会很快的完成查询和写入。

最后,记得关闭数据库:

db.close() 

养成好习惯。

分类目录: 编程