2011-11-23 13 views
38

के रूप में बिनडाटा यूयूआईडी प्राप्त करें वर्तमान में मेरे पास मोंगो में यूआईआईडी (प्रसंस्करण के लिए आवश्यक) के रूप में संग्रहीत कुछ आईडी हैं। वे इस तरह वापस आते हैं:मोंगो से स्ट्रिंग

"_id" : new BinData(3, "JliB6gIMRuSphAD2KmhzgQ==") 

डीबगिंग के लिए इस मान को स्ट्रिंग में बदलने का एक आसान तरीका क्या होगा?

बस स्पष्ट होना - एप्लिकेशन डेटा को ठीक से संभाल सकता है। मुझे बस मोंगो से वास्तविक यूयूआईडी प्राप्त करने का एक तरीका चाहिए।

उत्तर

64

आपके प्रश्न का उत्तर अधिक जटिल है कि आप उम्मीद करेंगे! मुख्य कारण यह जटिल है कि ऐतिहासिक कारणों से (दुर्भाग्य से) विभिन्न ड्राइवरों ने विभिन्न बाइट ऑर्डर का उपयोग करके डेटाबेस में यूयूआईडी लिखा है। आप इस बात का जिक्र नहीं करते कि आप किस ड्राइवर का उपयोग कर रहे हैं, लेकिन मैं उदाहरण के रूप में सी # ड्राइवर का उपयोग करूंगा।

मान लीजिए मैं एक दस्तावेज़ को सम्मिलित करने के लिए निम्न कोड का उपयोग करें:

var guid = new Guid("00112233-4455-6677-8899-aabbccddeeff"); 
collection.Insert(new BsonDocument { 
    { "_id", guid }, 
    { "x", 1 } 
}); 

मैं तो मोंगो खोल का उपयोग कर दस्तावेज़ की जांच करते हैं, यह इस तरह दिखता है:

> db.test.findOne() 
{ "_id" : BinData(3,"MyIRAFVEd2aImaq7zN3u/w=="), "x" : 1 } 
> 

मोंगो खोल एक है निर्मित हेक्स जिसे हेक्स स्ट्रिंग के रूप में बाइनरी मान प्रदर्शित करने के लिए उपयोग किया जा सकता है:

> var doc = db.test.findOne() 
> doc._id.hex() 
33221100554477668899aabbccddeeff 
> 

ध्यान से देखें: हेक्स स्ट्रिंग का बाइट ऑर्डर सी # प्रोग्राम में उपयोग किए गए मूल यूयूआईडी मान से मेल नहीं खाता है। ऐसा इसलिए है क्योंकि सी # ड्राइवर गुड क्लास की माइक्रोसॉफ्ट की ToByteArray विधि द्वारा लौटा गया बाइट ऑर्डर का उपयोग करता है (जो दुख की बात है कि विचित्र आदेश में बाइट्स लौटाता है, जो कि कई महीनों के लिए तथ्य नहीं मिला था)। अन्य ड्राइवरों की अपनी मूर्खताएं होती हैं।

इसके साथ मदद करने के लिए हमारे पास जावास्क्रिप्ट में लिखे गए कुछ सहायक कार्य हैं जिन्हें मोंगो खोल में लोड किया जा सकता है। वे इस फाइल में परिभाषित कर रहे हैं:

https://github.com/mongodb/mongo-csharp-driver/blob/master/uuidhelpers.js

मोंगो खोल एक फ़ाइल पर कार्रवाई करने के रूप में यह कमांड लाइन पर फ़ाइल का नाम उपलब्ध कराने के द्वारा शुरू होता है बताया जा सकता है (--shell तर्क के साथ) । इस फ़ाइल को लोड करने के बाद हमारे पास UUID हैं जो BinData मानों को बनाने और प्रदर्शित करने के लिए कई सहायक कार्यों तक पहुंच है। उदाहरण के लिए:

C:\mongodb\mongodb-win32-x86_64-2.0.1\bin>mongo --shell uuidhelpers.js 
MongoDB shell version: 2.0.1 
connecting to: test 
type "help" for help 
> var doc = db.test.findOne() 
> doc._id.toCSUUID() 
CSUUID("00112233-4455-6677-8899-aabbccddeeff") 
> db.test.find({_id : CSUUID("00112233-4455-6677-8899-aabbccddeeff")}) 
{ "_id" : BinData(3,"MyIRAFVEd2aImaq7zN3u/w=="), "x" : 1 } 
> 

इस उदाहरण में toCSUUID समारोह के रूप में एक CSUUID और CSUUID समारोह ताकि सी # चालक की बाइट आदेश सम्मेलनों का उपयोग कर एक UUID के लिए एक BinData मान बनाने के लिए प्रयोग किया जाता है एक BinData मूल्य प्रदर्शित करने के लिए प्रयोग किया जाता है हम एक यूयूआईडी पर पूछ सकते हैं। अन्य ड्राइवरों के लिए समान कार्य हैं (toJUUID, toPYUUID, JUUID, PYUUID)।

भविष्य में कुछ दिन सभी ड्राइवर मानक बाइट ऑर्डर के साथ एक नए बाइनरी उप प्रकार 4 पर मानकीकृत होंगे। इस बीच आपको उपयुक्त सहायक फ़ंक्शन का उपयोग करना होगा जो आपके द्वारा उपयोग किए जा रहे ड्राइवर से मेल खाता है।

+0

कि सिर्फ तुम क्या मैं देख रहा था, धन्यवाद! मुझे इसके पीछे इतिहास का कोई अंदाजा नहीं था। –

+0

क्या मैंने यह सपना देखा, या ऐसा करने का दूसरा तरीका नहीं था? जैसे '{" $ uuid ":" 00112233-4455-6677-8899-aabbccddeeff "}' – nilskp

+3

मीठे पवित्र भूत यह बेतुका है। फिर भी आपका धन्यवाद। –

2

उपयोग आपकी क्वेरी से पहले इस समारोह:

function ToGUID(hex) { 
    var a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2); 
    var b = hex.substr(10, 2) + hex.substr(8, 2); 
    var c = hex.substr(14, 2) + hex.substr(12, 2); 
    var d = hex.substr(16, 16); 
    hex = a + b + c + d; 
    var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12); 
    return '"' + uuid + '"'; 
} 

var id = new BinData(3, "JliB6gIMRuSphAD2KmhzgQ=="); 
ToGUID(id.hex()); 

परिणाम: "ea815826-0c02-e446-a984-00f62a687381"

0

आप जावा वसंत-डेटा का उपयोग कर रहे हैं, तो आप इस एल्गोरिथ्म का उपयोग कर सकते हैं:

function ToUUID(hex) { 
    var msb = hex.substr(0, 16); 
    var lsb = hex.substr(16, 16); 
    msb = msb.substr(14, 2) + msb.substr(12, 2) + msb.substr(10, 2) + msb.substr(8, 2) + msb.substr(6, 2) + msb.substr(4, 2) + msb.substr(2, 2) + msb.substr(0, 2); 
    lsb = lsb.substr(14, 2) + lsb.substr(12, 2) + lsb.substr(10, 2) + lsb.substr(8, 2) + lsb.substr(6, 2) + lsb.substr(4, 2) + lsb.substr(2, 2) + lsb.substr(0, 2); 
    hex = msb + lsb; 
    var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12); 

    return uuid; 
} 
संबंधित मुद्दे