使用PyMongo访问MongoDB字段触发KeyError,求排查解决方法
哈哈,这个问题我之前也踩过坑,典型的不可见字符搞鬼!咱们一步步拆解清楚:
第一个错误:KeyError: '\ufeffcloud_data'
\ufeff是UTF-8编码里的字节顺序标记(BOM)——这意味着你MongoDB里的字段名根本不是表面上看到的cloud_data,而是前面偷偷藏了这个不可见的BOM字符!你看到的文档结构显示"cloud_data",是因为MongoDB的客户端(比如Compass、Shell)会自动屏蔽这个BOM,但PyMongo会严格匹配字符串,直接用u'cloud_data'自然找不到。
第二个错误:KeyError: " cloud_data"
改成双引号后出现空格,纯粹是手滑的低级错误——要么是你手动输入时多打了空格,要么是复制粘贴时带了前导空格,和BOM问题是两码事😅
怎么解决?
先确认真实字段名:
先把整个文档的所有键打印出来,就能看到藏在背后的真实字段名了:print(list(video_files_data.keys()))输出大概率会显示
['_id', 'file_id', '\ufeffcloud_data']或者['_id', 'file_id', ' cloud_data'],直接暴露问题。彻底修正(推荐):
最好直接修改MongoDB里的字段名,一劳永逸解决问题。在Mongo Shell里执行更新命令:// 替换your_collection为你的集合名 db.your_collection.updateMany( {}, { $rename: { "\ufeffcloud_data": "cloud_data" } } )如果是空格问题,就把
"\ufeffcloud_data"换成" cloud_data"即可。临时应急(不推荐长期用):
如果暂时不想动数据库,也可以直接用带特殊字符的键名访问:return video_files_data[u'\ufeffcloud_data']但这只是权宜之计,后续维护很容易踩坑。
为啥会出现这种情况?
大概率是你当初往MongoDB存数据时,用的工具/代码带了BOM——比如用Windows记事本编辑JSON文件,默认会给UTF-8文件加BOM,直接导入后就把带BOM的字段名存进去了。以后存数据前多检查下字段名的字符串就行~
内容的提问来源于stack exchange,提问作者scphantm

