Mongo UUID python vs java格式

时间:2014-11-03 10:49:01

标签: python pymongo uuid

我有一个应用程序将请求发送到restAPI,其中java进程将数据存储在mongo中。当我尝试使用pymongo读取这些数据时,直接读取数据库,它会以不同的方式获取UUID(似乎是由于java / python中的不同编码)。

有没有办法来回转换这个UUID?

编辑:

一些例子:

  

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

     python中的

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

感谢,

1 个答案:

答案 0 :(得分:3)

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

根本问题可能是您的Java代码使用旧版UUID3标准将Java驱动程序中的UUID存储在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)