MongoDB Python:使用pymongo无法删除名称含.的字段如何解决
解决方案
根因
MongoDB 4.4及更早版本的普通更新操作会默认把字段名中的.解析为嵌套文档的层级分隔符,你写的AverageDailyPM2.5会被识别为「找顶层key为AverageDailyPM2的嵌套文档下的5子字段」,自然匹配不到名称带.的目标字段,所以删除失效。
适配4.4版本的修复代码
你需要用聚合管道模式的更新来规避.的自动解析逻辑,具体实现如下:
# 替换为你自己的数据库实例初始化逻辑 # client = pymongo.MongoClient(你的连接串) # db = client.你的库名 db.city.update_many( filter={}, update=[ { "$replaceRoot": { "newRoot": { "$arrayToObject": { "$filter": { "input": {"$objectToArray": "$$ROOT"}, "cond": {"$ne": ["$$this.k", "AverageDailyPM2.5"]} } } } } } ] )
实现逻辑说明
- 先把整个文档通过
$objectToArray转为[{k: 字段名, v: 字段值}, ...]格式的数组,此时字段名变为普通字符串,不会触发.的嵌套解析 - 用
$filter过滤掉k等于目标带点字段名的数组元素 - 再把过滤后的数组转回普通文档,通过
$replaceRoot覆盖原文档,即可完成目标字段删除
版本兼容提示
如果后续你升级到MongoDB 5.0及以上版本,可以直接调用内置的$removeField运算符,代码会更简洁:
db.city.update_many({}, [{"$removeField": "AverageDailyPM2.5"}])
内容的提问来源于stack exchange,提问作者Kyle H
相关产品推荐
相关产品推荐

