如何用PyMongo读取MongoDB所有集合数据?解决文件未找到报错
问题分析与解决方案
嘿,我一眼就看出问题所在啦!你代码里犯了个典型的误解——你把MongoDB集合的名称当成本地JSON文件名去用open()读取了,这当然会报FileNotFoundError啊!MongoDB的集合数据是存在数据库服务里的,不是本地磁盘上的文件,完全不需要用文件读取的方式来获取~
下面是修正后的完整代码,我会一步步给你解释逻辑:
import pandas as pd from pymongo import MongoClient # 连接本地MongoDB服务,这部分你写的没问题 connection = MongoClient('localhost', 27017) db = connection.Tmobile # 获取所有非系统集合名称(注意:pymongo 3.7+版本推荐用list_collection_names,旧版本可以用collection_names) collection_names = db.list_collection_names(include_system_collections=False) # 遍历每个集合 for collect_name in collection_names: print(f"正在处理集合: {collect_name}") # 先获取当前集合的对象(这才是访问MongoDB集合数据的正确方式) current_collection = db[collect_name] # 读取集合中的所有文档:如果数据量不大,直接转成列表;数据量大的话建议用迭代器分批处理 documents = list(current_collection.find()) # 转成DataFrame方便后续计算(如果不需要DataFrame,直接操作documents列表就行) df = pd.DataFrame(documents) print(f"集合 {collect_name} 共有 {len(df)} 条数据\n") # ---------------------- 这里添加你的计算逻辑 ---------------------- # 举个例子:统计某个字段的平均值(假设集合里有'usage'字段) # if 'usage' in df.columns: # avg_usage = df['usage'].mean() # print(f"{collect_name} 中usage字段的平均值: {avg_usage:.2f}\n")
关键修正点说明
- 替换错误的文件读取逻辑:删掉了
open(collect1,'r')和json.load(fi),改用db[collect_name]获取集合对象,再用find()读取集合内的文档。 - 更新集合名称获取方法:
collection_names()在新版pymongo中已经被标记为过时,推荐用list_collection_names(),兼容性更好。 - 数据处理灵活性:把文档转成DataFrame是为了方便后续的统计计算,如果你的需求不需要DataFrame,直接遍历
documents列表处理单个文档即可。 - 大数据量优化:如果某个集合数据量特别大,不要直接用
list(current_collection.find()),而是用迭代器逐个处理:for doc in current_collection.find(): # 在这里编写单个文档的处理逻辑 print(doc)
内容的提问来源于stack exchange,提问作者sri lakshmi
相关产品推荐
相关产品推荐

