使用PyMongo从MongoDB提取数据:访问cusip.value报错的技术咨询
解决PyMongo提取MongoDB嵌套字段报错的问题
这种情况在MongoDB的使用中很常见——虽然你看到大部分文档里name、assetClass和cusip都是带value子字段的嵌套结构,但肯定是有部分匹配查询条件的文档,要么没有cusip字段,要么cusip字段里没有value子字段,而name和assetClass在所有返回的文档里都有完整的嵌套结构,所以之前只提取这两个字段时没报错。
我给你几个针对性的解决方案:
1. 用get()方法安全访问嵌套字段(推荐)
这个方法可以避免因字段缺失导致的KeyError,当字段不存在时返回你指定的默认值(比如None),不中断循环:
for i in col_keys.find({"updatedAt": {"$gte": startDate, "$lt": endDate}}): Id = i["_id"] priority = i["priority"] createdAt = i["createdAt"] updatedAt = i["updatedAt"] name = i["name"]["value"] asset = i["assetClass"]["value"] # 先尝试获取cusip字段,不存在则返回空字典;再从字典里取value,不存在则返回None cusip = i.get("cusip", {}).get("value", None)
2. 提前过滤出结构完整的文档
如果你只需要包含cusip.value的记录,可以在查询阶段就过滤掉不符合条件的文档,这样后续访问字段就不会报错了:
# 构造查询条件,确保cusip和cusip.value都存在 query = { "updatedAt": {"$gte": startDate, "$lt": endDate}, "cusip": {"$exists": True}, "cusip.value": {"$exists": True} } for i in col_keys.find(query): Id = i["_id"] priority = i["priority"] createdAt = i["createdAt"] updatedAt = i["updatedAt"] name = i["name"]["value"] asset = i["assetClass"]["value"] cusip = i["cusip"]["value"]
3. 先探查数据,定位问题文档
如果你想明确到底是哪些文档出了问题,可以先执行以下查询,统计缺失字段的文档数量:
# 统计没有cusip字段的文档数 missing_cusip_count = col_keys.count_documents({ "updatedAt": {"$gte": startDate, "$lt": endDate}, "cusip": {"$exists": False} }) print(f"缺失cusip字段的文档共有 {missing_cusip_count} 条") # 统计cusip存在但没有value子字段的文档数 missing_cusip_value_count = col_keys.count_documents({ "updatedAt": {"$gte": startDate, "$lt": endDate}, "cusip": {"$exists": True}, "cusip.value": {"$exists": False} }) print(f"cusip存在但缺失value的文档共有 {missing_cusip_value_count} 条")
毕竟MongoDB是无模式数据库,即使大部分文档结构一致,也可能存在个别记录因数据插入时的校验缺失、业务逻辑变更等原因,出现字段缺失或结构不一致的情况,所以访问嵌套字段时,养成做存在性检查或用get()的习惯会更稳妥。
内容的提问来源于stack exchange,提问作者superunknown
相关产品推荐
相关产品推荐

