2014-11-03 35 views
0

我有一個應用程序將請求發送到restAPI,其中java進程將數據存儲在mongo中。當我嘗試使用pymongo讀取這些數據時,直接讀取數據庫,它會以不同的方式獲取UUID(看起來是由於java/python中的編碼不同)。Mongo UUID python vs java格式

有沒有辦法將此UUID來回轉換?

編輯:

的幾個例子:

在Java:38f51c1d-360E-42c1-8f9a-3f0a9d08173d, 1597d6ea-8e5f-473B-A034-f51de09447ec

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

個感謝,

+1

如果您發佈了兩種類型的示例(理想情況下是相同的值!),將會有所幫助。 – djc 2014-11-03 12:43:50

回答

2

我花了我一天的生活試圖解決同樣的問題...

問題的根源可能是您的Java代碼存儲與使用Java驅動程序中蒙戈數據庫的UUID傳統的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查詢也將有的UUID的格式相同的API。

這是一個使用這種技術的完整查詢示例。

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) 
+0

我記得很久以前(幾年)有過這個問題,但我忘記了解決方案是什麼。感謝您再次提出併發布答案。 – mikeho 2015-11-05 19:20:33