PyMongo跨文档复制UUID字段丢失BinData类型该如何解决?
解决方案
格式不一致本质是PyMongo的UUID序列化/反序列化规则没有全局统一,以及手动转换时没有使用标准的类型转换方法导致的,可通过以下两种方案解决:
方案1:全局统一UUID表示规则(推荐)
初始化MongoClient时显式指定uuidRepresentation参数,和你首次插入数据时使用的规则对齐(你现存的BinData subtype 3对应pythonLegacy规则):
from pymongo import MongoClient from bson.binary import UuidRepresentation # 初始化客户端时统一配置 client = MongoClient( "mongodb://你的连接地址", uuidRepresentation=UuidRepresentation.PYTHON_LEGACY ) collection = client.你的库名.你的集合名
配置完成后原业务代码无需任何修改,直接复用查询得到的oldDoc['someField']插入新文档,就会自动保存为BinData(3, xxx)格式,查询时用uuid.UUID(hex字符串)作为条件也能正常匹配,返回时用str(doc['someField'])即可拿到前端需要的十六进制表示。
方案2:手动转换类型(无需修改全局配置)
如果不方便调整全局客户端配置,可以在插入新文档前手动将UUID对象转换为指定subtype的Binary对象:
import uuid from bson.binary import Binary, UuidRepresentation oldDoc = collection.find_one({"_id": 123}) target_field = oldDoc['someField'] # 统一转换为subtype 3的Binary对象 if isinstance(target_field, uuid.UUID): target_field = Binary.from_uuid(target_field, UuidRepresentation.PYTHON_LEGACY) collection.insert_one({"_id":456, "someField": target_field})
异常问题说明
你之前手动转换得到的异常结构,是因为没有使用官方提供的Binary.from_uuid方法进行标准转换,直接构造Binary对象时字节序或subtype参数不匹配导致的,使用上述标准方法即可避免该问题。
内容的提问来源于stack exchange,提问作者Gerd
相关产品推荐
相关产品推荐

