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()

养成好习惯。

猜你也喜欢

发表评论

邮箱地址不会被公开。