如何在Python中转换Studio 3T查询Mongo返回的.NET UUID与UUID v1
Python查询MongoDB返回UUID转换为.NET格式方案
问题原因
.NET的Guid(即你所说的.NET UUID)采用混合端序存储,而Python标准UUID、pymongo默认返回的是大端序(网络字节序)UUID,二者字节排列规则不同,导致相同存储值显示的字符串不一致。
方案1:pymongo连接时直接配置(推荐)
直接在初始化MongoClient时指定uuidRepresentation参数为csharpLegacy,查询结果会直接返回和Studio 3T一致的.NET格式UUID,无需手动转换:
from pymongo import MongoClient # 连接时指定UUID表示格式为.NET legacy格式 client = MongoClient("mongodb://你的MongoDB连接地址", uuidRepresentation="csharpLegacy") db = client.你的数据库名 col = db.你的集合名 # 此时查询返回的_id直接就是.NET格式对应的UUID result = col.find_one() print(result["_id"]) # 输出与Studio 3T中显示的.NET UUID完全一致
注:uuidRepresentation参数在pymongo 3.12及以上版本支持,低版本驱动需要升级后使用
方案2:手动转换已拿到的Python UUID对象
如果不方便修改连接配置,可以用自定义函数手动转换字节序:
import uuid def py_uuid_to_dotnet_guid(py_uuid: uuid.UUID) -> uuid.UUID: # 提取UUID原始字节 raw_bytes = py_uuid.bytes # 按.NET Guid字节序规则重排:前4位倒序、接下来2位倒序、接下来2位倒序、剩余8位保持顺序 rearranged_bytes = ( raw_bytes[3::-1] + raw_bytes[5:3:-1] + raw_bytes[7:5:-1] + raw_bytes[8:] ) return uuid.UUID(bytes=rearranged_bytes) # 调用示例 py_uuid = uuid.UUID('0fc97e3a-8f0c-be4f-a5dc-b166af761afd') dotnet_guid = py_uuid_to_dotnet_guid(py_uuid) print(str(dotnet_guid)) # 输出对应.NET格式的UUID字符串
补充说明
如果需要将Python生成的UUID写入MongoDB且要求.NET侧可以正常识别,同样需要在连接时配置uuidRepresentation="csharpLegacy",避免写入后格式错乱。除了csharpLegacy外,pymongo还支持javaLegacy、pythonLegacy等配置,可根据实际使用场景选择。
内容的提问来源于stack exchange,提问作者tcblue
相关产品推荐
相关产品推荐

