2012-07-06 5 views
15

मैं सी # 10Gen द्वारा आपूर्ति की चालक की MongoDB के संस्करण 2.06 और संस्करण (1.5) चल रहा हूँ।MongoDB और दस्तावेजों की पहचान क्या आसानी से वास्तविक Guid पुनः प्राप्त करने के GUIDs स्टोर करने के लिए कारगर तरीका है के लिए guids साथ?

मेरी संस्थाओं के

प्रत्येक तरह के रूप में एक आईडी संपत्ति सेटअप है ...

[BsonId(IdGenerator = typeof(GuidGenerator))] 
public Guid Id { get; set; } 

ईद क्षेत्र द्विआधारी के रूप में संग्रहीत किया जाता है - 3: UuidLegacy। यह कैसे संग्रहीत किया जाता है जब मैं एक इकाई यह ईद के लिए निम्नलिखित जावास्क्रिप्ट ऑब्जेक्ट पर ToJson() फोन की वजह से।

_id : Object 
$binary: "some values here" 
$type: "03" 

यह स्पष्ट रूप से है क्योंकि डेटा को बाइनरी = 3: यूयूड लीगेसी के रूप में संग्रहीत किया जा रहा है। यह समझ में आता है।

मैं अपने जावास्क्रिप्ट कोड में वास्तविक Guid उपयोग करना चाहते हैं। MongoDB के लिए यह कितना कुशल होगा यदि मैंने अपना आईडी गुण निम्न जैसा दिखता है?

[BsonId(IdGenerator = typeof(GuidGenerator)),MongoDB.Bson.Serialization.Attributes.BsonRepresentation(BsonType.String)] 
public Guid Id { get; set; } 

यह मैंगोडब को मेरे आईडी को एक स्ट्रिंग के रूप में स्टोर करता है। लेकिन यह वास्तव में कितना कुशल है? मैं अपने आईडी के लिए बाइनरी प्रारूप का अनुमान लगा रहा हूं, लेकिन मुझे वास्तव में गइड की आवश्यकता है। Guid मैं अपने json में जरूरत के लिए uuidLegacy: 3 -

मैं कैसे द्विआधारी से जा सकते हैं?

मुझे लगता है कि एक और विचार होगा कि मैं सिर्फ $ द्विआधारी मूल्य का उपयोग कर सकता हूं जो मुझे भेजा गया है? मैं लुकअप करने के लिए आईडी का उपयोग करता हूं और जैसे कि मेरे क्वेरी स्ट्रिंग्स का हिस्सा।

धन्यवाद,

उत्तर

25

GUIDs के साथ कार्य करना कुछ नुकसान है, ज्यादातर कैसे मोंगो खोल में द्विआधारी प्रतिनिधित्व के साथ काम करने के लिए से संबंधित है और यह भी ऐतिहासिक दुर्घटनाओं जो विभिन्न बाइट आदेश का उपयोग कर GUIDs भंडारण विभिन्न चालकों के परिणामस्वरूप गया है।

var document = new BsonDocument { { "_id", Guid.NewGuid() }, { "x", 1 } }; 
collection.Drop(); 
collection.Insert(document); 
Console.WriteLine("Inserted GUID: {0}", document["_id"].AsGuid); 

जो जब मैं यह उत्पादन भाग गया:

Inserted GUID: 2d25b9c6-6d30-4441-a360-47e7804c62be 

जब मैं मोंगो खोल में इस प्रदर्शित मैं:

मैं मुद्दों को वर्णन करने के लिए निम्न कोड का इस्तेमाल किया

> var doc = db.test.findOne() 
> doc 
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 } 
> doc._id.hex() 
c6b9252d306d4144a36047e7804c62be 
> 

ध्यान दें कि बाइट ऑर्डर हेक्स के रूप में प्रदर्शित होने पर भी मूल GUID से मेल नहीं खाता है। यह ऐतिहासिक दुर्घटना है जिसके बारे में मैं बात कर रहा था। सभी बाइट्स देखते हैं, वे तो बस Guid.ToByteArray के माइक्रोसॉफ्ट के कार्यान्वयन के लिए एक असामान्य आदेश धन्यवाद() में हैं।

आप मोंगो में GUIDs के साथ काम करने में मदद करने शैल आप निर्देशिका है जहाँ mongo.exe संग्रहीत किया जाता है के लिए सहायक कार्यों की निम्न फ़ाइल नकल कर सकता है:

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

फ़ाइल पर कुछ संक्षिप्त प्रलेखन टिप्पणी है शीर्ष जो आपको सहायक मिल सकता है। इन कार्यों को मोंगो शैल में उपलब्ध कराने के लिए आपको इस फ़ाइल को शुरू होने के बाद मोंगो खोल को बताने की आवश्यकता है।

C:\mongodb\mongodb-win32-x86_64-2.0.6\bin>mongo --shell uuidhelpers.js 
MongoDB shell version: 2.0.6 
connecting to: test 
type "help" for help 
> var doc = db.test.findOne() 
> doc 
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 } 
> doc._id.hex() 
c6b9252d306d4144a36047e7804c62be 
> doc._id.toCSUUID() 
CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be") 
> 

तुम भी सहायक कार्यों में से एक और GUIDs के लिए क्वेरी करने के लिए इस्तेमाल कर सकते हैं: निम्न नमूना सत्र देखें

> db.test.find({_id : CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")}) 
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 } 
> 

जहाँ तक तार के रूप में अपने GUIDs भंडारण के रूप में, उस चीज़ का एक अनसुना नहीं है करने के लिए और यह निश्चित रूप से मोंगो खोल में डेटा को देखने और पूछताछ को आसान बनाता है और विभिन्न बाइट ऑर्डर के साथ सभी मुद्दों से बचाता है। एकमात्र नुकसान यह है कि यह अधिक जगह (लगभग डबल) का उपयोग करता है।

+0

हैलो रॉबर्ट! आपकी प्रतिक्रिया के लिए धन्यवाद, बहुत सराहना की। अंतरिक्ष आवश्यकताओं की दोगुना मेरे लिए चिंता का विषय है। – RDotLee

+1

स्ट्रिंग के रूप में GUID को संग्रहीत करने के साथ मैंने एक और नुकसान यह सुना है कि आप mongodb एग्रीगेशन फ्रेमवर्क का उपयोग नहीं कर सकते हैं। –

+0

"डबलिंग" एक डरावना शब्द है, लेकिन यह केवल GUID फ़ील्ड पर लागू होता है, जो बीएसओएन में केवल 17 (?) बाइट है। स्ट्रिंग में 36 बाइट्स लगेगा, जो * लगभग * दोगुना है, लेकिन फिर भी प्रति GUID केवल अतिरिक्त 1 9 बाइट्स है। यदि प्रति GUID 19 अतिरिक्त बाइट आपके लिए एक समस्या है, तो बीएसओएन शायद आपके लिए प्रारूप नहीं है। – meustrus

संबंधित मुद्दे