使用PyMongo提取MongoDB嵌套name字段报错,如何调整循环获取内部元素
问题原因
报错通常由两类异常数据导致:
- 部分文档的
name字段不存在,或不是字典(对象)类型,直接调用.keys()方法会触发属性错误 - 部分
name下的子项不存在value或source字段,直接按键取值会抛出键错误
修复方案
在循环中补充字段存在性、类型校验逻辑即可,修改后代码参考:
for i in col_keys.find({"updatedAt": {"$gte": startDate, "$lt": endDate}}): Id = i["_id"] priority = i["priority"] createdAt = i["createdAt"] updatedAt = i["updatedAt"] # 先校验name字段存在且为字典类型 if "name" in i and isinstance(i["name"], dict): nameElement = i["name"] for j in nameElement.keys(): sub_item = nameElement[j] # 再校验子项为字典,且包含需要提取的value、source字段 if isinstance(sub_item, dict) and "value" in sub_item and "source" in sub_item: value = sub_item["value"] source = sub_item["source"] # 此处补充你自己的字段存储、处理逻辑
可选优化
如果你的MongoDB版本支持聚合查询,也可以在查询阶段就过滤掉不符合格式要求的文档,减少代码层面的判断开销:
# 聚合查询提前过滤name为对象类型的文档 query_pipeline = [ {"$match": { "updatedAt": {"$gte": startDate, "$lt": endDate}, "name": {"$type": "object"} }} ] for i in col_keys.aggregate(query_pipeline): # 后续处理逻辑和上述一致
内容的提问来源于stack exchange,提问作者superunknown
相关产品推荐
相关产品推荐

