Mongo UUID Python 与 Java 格式对比
我有一个应用程序,它会向一个叫做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 个回答
我花了一整天的时间来解决这个问题……
问题的根本原因可能是你的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)