PyMongo问题:如何用Python的int值查询MongoDB的Long类型数据
解决PyMongo超大整数与MongoDB Long类型匹配及查询条件错误的问题
问题根源
- 类型不匹配:Python中超过32位的整数存入MongoDB时,会被自动转为BSON的
int64类型(对应MongoShell中的Long)。但查询时直接传入Pythonint,PyMongo不会自动转换类型,导致MongoDB无法匹配存储的Long类型值。 - 查询条件写法错误:原代码中
{"level_1": {"field_1": big_int_value}}是完全匹配整个level_1子文档,即要求level_1只能包含field_1一个字段。而首次插入后level_1包含field_1和field_2,因此即使类型匹配,这个条件也无法找到已存在的文档。
原生优雅解决方案
使用PyMongo内置的bson.int64.Int64类型包装查询值,同时修改查询条件为匹配子文档中的单个字段(用点路径语法):
- 导入
Int64类型 - 用点路径
level_1.field_1定位目标字段,避免完全匹配子文档的局限性 - 用
Int64包装超大整数作为查询值,确保与MongoDB存储的类型一致
修改后的代码
from bson.int64 import Int64 def update_value(big_int_value: int, bool_value: bool): db["my_db"].update_one( {"level_1.field_1": Int64(big_int_value)}, {"$set": {"level_1.field_2": bool_value}}, upsert=True )
补充说明
插入时PyMongo会自动将超大int转为Int64存入MongoDB,无需手动包装;但查询时必须显式用Int64包装,才能保证类型匹配,成功找到目标文档。
内容的提问来源于stack exchange,提问作者Andrey_Murgin
相关产品推荐
相关产品推荐

