You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:06:03