我有一个应用程序将请求发送到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
感谢,
答案 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)