如何将MongoDB指定对象提取为Pandas DataFrame?
从MongoDB提取指定字段并转换为Pandas DataFrame
步骤1:优化MongoDB查询,过滤出仅含manuelActivityInfo的活动条目
原查询会返回包含符合条件活动的整个文档,但文档的activities数组里可能混有不带manuelActivityInfo的条目。用聚合管道可以直接在数据库层面过滤数组元素,减少后续数据处理量:
# 使用聚合管道过滤并提取目标数据 pipeline = [ # 匹配存在manuelActivityInfo的文档 {"$match": {"activities.manuelActivityInfo": {"$exists": True}}}, # 过滤activities数组,仅保留带manuelActivityInfo的条目 {"$project": { "filtered_activities": { "$filter": { "input": "$activities", "as": "activity", "cond": {"$exists": ["$$activity.manuelActivityInfo", True]} } }, "_id": 0 }}, # 限制返回数量(可选) {"$limit": 5} ] # 执行聚合查询 results = list(coll.aggregate(pipeline))
步骤2:整理数据,提取目标字段
遍历查询结果,把每个过滤后的活动条目展开,提取需要的字段:
import pandas as pd # 初始化空列表存储整理后的数据 processed_data = [] for doc in results: for activity in doc["filtered_activities"]: # 提取字段并重组为字典 entry = { "ActivityId": activity["activityId"], "manuelActivityTypeId": activity["manuelActivityInfo"]["manuelActivityTypeId"], "manuelActivityTypeName": activity["manuelActivityInfo"]["manuelActivityTypeName"], "manuelActivityMainSubjectId": activity["manuelActivityInfo"]["manuelActivityMainSubjectId"], "manuelActivityMainSubjectName": activity["manuelActivityInfo"]["manuelActivityMainSubjectName"], "manuelActivityDetailSubjectId": activity["manuelActivityInfo"]["manuelActivityDetailSubjectId"], "manuelActivityDetailSubjectName": activity["manuelActivityInfo"]["manuelActivityDetailSubjectName"] } processed_data.append(entry)
步骤3:转换为Pandas DataFrame
直接用整理好的列表生成DataFrame:
df = pd.DataFrame(processed_data) # 查看结果 print(df.head())
补充说明
- 如果原集合中
manuelActivityInfo可能存在缺失(即使已经用$exists匹配),可以添加if "manuelActivityInfo" in activity的判断,避免KeyError。 - 若数据量较大,建议分批次处理,避免一次性加载过多数据到内存。
内容的提问来源于stack exchange,提问作者Erdal Tutku YILMAZ
相关产品推荐
相关产品推荐

