PyMongo insert_one存储Lighthouse JSON至MongoDB遇含点键报错求替代参数
解决PyMongo insert_one中含点键的存储问题
很遗憾,PyMongo的insert_one()方法并没有和旧版insert()一样的check_keys=False参数。而且要提醒你的是,即使旧版insert()允许你设置这个参数,MongoDB服务器本身也不允许文档键包含.或$——这个限制是数据库层面的,客户端跳过检查也没用,最终还是会被服务器拒绝存储。
所以要解决Lighthouse JSON数据中含点键的问题,最靠谱的办法是提前修改这些非法键名,比如把.替换成合法的字符(比如_或者-)。这里给你一个递归处理字典/列表的函数,可以自动遍历整个JSON结构,替换所有键里的点:
def sanitize_document_keys(doc): # 处理字典类型 if isinstance(doc, dict): cleaned_dict = {} for key, value in doc.items(): # 替换键中的点为下划线 cleaned_key = key.replace('.', '_') # 递归处理嵌套的内容 cleaned_dict[cleaned_key] = sanitize_document_keys(value) return cleaned_dict # 处理列表类型 elif isinstance(doc, list): return [sanitize_document_keys(item) for item in doc] # 其他类型直接返回 else: return doc # 假设你的Lighthouse数据存在变量lighthouse_data里 cleaned_data = sanitize_document_keys(lighthouse_data) # 现在可以正常用insert_one插入了 your_collection.insert_one(cleaned_data)
如果你有特殊需求必须保留原始键名的格式,还有一个变通方案:把含非法键的部分数据打包成一个字符串(比如用JSON序列化),或者嵌套到一个子文档的数组中,但这种方法会牺牲数据的可查询性,所以一般不推荐。
内容的提问来源于stack exchange,提问作者user5798201
相关产品推荐
相关产品推荐

