Mongo UUID python vs java format



我有一个向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

谢谢,

我花了一天的时间试图解决同样的问题。。。

根本问题可能是您的Java代码将UUID与使用遗留UUID3标准的Java驱动程序一起存储在Mongo数据库中。为了验证,您只需使用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)

最新更新