Mongo UUID Python 与 Java 格式对比

3 投票
1 回答
1699 浏览
提问于 2025-05-01 06:55

我有一个应用程序,它会向一个叫做restAPI的接口发送请求,然后一个Java程序会把数据存储到Mongo数据库里。当我尝试用pymongo直接读取这些数据时,发现读取到的UUID(通用唯一识别码)格式不一样(这似乎是因为Java和Python在编码上有差异)。

有没有办法把这个UUID在两种语言之间转换呢?

补充说明:

这里有几个例子:

在Java中:38f51c1d-360e-42c1-8f9a-3f0a9d08173d, 1597d6ea-8e5f-473b-a034-f51de09447ec

在Python中: c1420e36-1d1c-f538-3d17-089d0a3f9a8f, 3b475f8e-ead6-9715-ec47-94e01df534a0

谢谢,

暂无标签

1 个回答

12

我花了一整天的时间来解决这个问题……

问题的根本原因可能是你的Java代码在用Java驱动程序把UUID存储到Mongo数据库时,使用了过时的UUID3标准。你可以通过登录Mongo shell,查看UUID的原始输出,来确认这个问题。如果看到有个3,那就是问题所在。

db.my_collection_name.find().limit(1)
...BinData(3,"blahblahblahblahblah"),...

在UUID3的情况下,Mongo决定根据不同的编程语言,所有驱动程序都采用不同的方式(谢谢Mongo……)。直到UUID4,Mongo才决定在各种语言的驱动程序中统一标准。理想情况下,你应该考虑切换到UUID4,但这会带来更大的影响,所以不一定实用。参考链接:http://3t.io/blog/best-practices-uuid-mongodb/

别担心,还有希望!让一切正常工作的神奇方法就是在CodecOptions中使用JAVA_LEGACY的uuid规范来拉取集合。

my_collection = db.get_collection('MyCollectionName', CodecOptions(uuid_representation=JAVA_LEGACY))

之后,你就可以用API中的UUID进行查询,查询结果也会以和API相同的格式返回UUID。

这里有一个使用这种方法的完整查询示例。

import pprint
import uuid
from bson.binary import JAVA_LEGACY
from bson.codec_options import CodecOptions
from pymongo import MongoClient

PP = pprint.PrettyPrinter(indent=2)

client = MongoClient('localhost', 27017)
db = client.my_database

# REFERENCES: http://3t.io/blog/best-practices-uuid-mongodb/  |  http://api.mongodb.org/python/current/api/bson/binary.html
my_collection = db.get_collection('my_collection', CodecOptions(uuid_representation=JAVA_LEGACY))

my_java_uuid3 = "bee4ecb8-11e8-4267-8885-1bf7657fe6b7"
results = list(my_collection.find({"my_uuid": uuid.UUID(my_java_uuid3)}))

if results and len(results) > 0:
    for result in results:
        PP.pprint(result)

撰写回答