2011-04-01 8 views
21

मैं एक .NET GUID को एक मोंगोडीबी ऑब्जेक्ट आईडी (सी # में) में कैसे परिवर्तित कर सकता हूं। साथ ही, क्या मैं इसे ऑब्जेक्ट आईडी से उसी GUID में फिर से परिवर्तित कर सकता हूं?कनवर्ट करें .NET GUID को MongoDB ऑब्जेक्ट आईडी

+5

सामान्य स्थिति में, आप इसे वापस नहीं बदल सकते हैं क्योंकि एक GUID में 128-बिट हैं, जबकि ऑब्जेक्टआईडी में केवल 96-बिट हैं। रूपांतरण प्रक्रिया हानिकारक है, और इसलिए उलट नहीं है। –

+0

क्या मैं सिर्फ एक दस्तावेज़ के लिए _ID को GUID पर सेट कर सकता हूं, और ऑब्जेक्ट आईडी का उपयोग नहीं कर सकता? – Journeyman

+0

नॉरिस: (अस्वीकरण मेरे पास बहुत कम मोंगोडीबी अनुभव है) मुझे लगता है कि आप कर सकते हैं और मोंगो शिकायत नहीं करेंगे। मुझे लगता है कि ऑब्जेक्टआईडी चुनने का एकमात्र कारण अंतरिक्ष को बचाने के लिए है। यह अन्य प्रश्न http://stackoverflow.com/questions/4125275/mongodb-norm-and-poco मदद कर सकता है। –

उत्तर

28

आप ObjectId को GUID में परिवर्तित नहीं कर सकते हैं और इसके विपरीत, क्योंकि वे दो अलग-अलग चीजें हैं (विभिन्न आकार, एल्गोरिदम)।

आप GUID सहित mongoDb _id के लिए किसी भी प्रकार का उपयोग कर सकते हैं।

आधिकारिक C# चालक में उदाहरण के लिए आप विशेषता [BsonId] का होना चाहिए:

[BsonId] 
public Guid Id {get;set;} 

[BsonId] 
public int Id {get;set;} 

ObjectId:

एक BSON ObjectID एक 12-बाइट मूल्य एक 4-बाइट टाइमस्टैम्प से मिलकर (है युग के बाद से सेकंड), एक 3-बाइट मशीन आईडी, एक 2-बाइट प्रक्रिया आईडी, और 3-बाइट काउंटर। ध्यान दें कि टाइमस्टैम्प और काउंटर फ़ील्ड बीएसओएन के विपरीत बड़े एंडियन संग्रहीत होना चाहिए। ऐसा इसलिए है क्योंकि वे बाइट-बाय-बाइट की तुलना में हैं और हम अधिकतर बढ़ते क्रम को सुनिश्चित करना चाहते हैं।

GUID:

एक GUID का मूल्य के रूप में एक 32-चरित्र हेक्साडेसिमल स्ट्रिंग का प्रतिनिधित्व करती है, ऐसे के रूप में {21EC2020-3AEA-1069-A2DD-08002B30309D}, और आम तौर पर है एक 128-बिट पूर्णांक

2

हालांकि प्रत्यक्ष जवाब यह नहीं मानते कि कोई आवश्यकता नहीं है। एक ऑब्जेक्ट आईडी होना चाहिए --- केवल यह अद्वितीय है।

किसी भी वैध प्रकार को एम्बेडेड ऑब्जेक्ट या ए सहित _I'd के लिए सेट किया जा सकता है। _id के लिए GUID का उपयोग करके आपको ठीक होना चाहिए (किसी विशिष्टता उल्लंघन को छोड़कर); वास्तव में, ऑब्जेक्टआईडी वास्तव में सिर्फ एक कस्टम GUID है।

8

FYI करें आप एक Guid

के लिए एक ObjectId से परिवर्तित कर सकते हैं के रूप में जमा
public static Guid AsGuid(this ObjectId oid) 
    { 
     var bytes = oid.ToByteArray().Concat(new byte[] { 5, 5, 5, 5 }).ToArray(); 
     Guid gid = new Guid(bytes); 
     return gid; 
    } 

    /// <summary> 
    /// Only Use to convert a Guid that was once an ObjectId 
    /// </summary> 
    public static ObjectId AsObjectId(this Guid gid) 
    { 
     var bytes = gid.ToByteArray().Take(12).ToArray(); 
     var oid = new ObjectId(bytes); 
     return oid; 
    } 
+0

जब मैंने ऑब्जेक्टआईडी में ऑब्जेक्ट आईडी में और फिर ऑब्जेक्टआईड से गुइड में परिवर्तित कर दिया है तो परिणाम अलग-अलग –

+0

है जब आप किसी ऑब्जेक्ट को एक ऑब्जेक्ट में परिवर्तित करते हैं तो आप वास्तव में डेटा खो देते हैं। उपर्युक्त रूपांतरण एक तरह से दोहराने योग्य रूपांतरण होना चाहिए। – MiddleTommy

+0

ऑब्जेक्टआईडी से गुइड और पीठ में कनवर्ट करना संभव हो सकता है लेकिन कुछ शोध लेगा। मैं पिछले 4 सालों से ऑब्जेक्टआईडी का उपयोग नहीं कर रहा हूं इसलिए मुझे नहीं पता कि ऑब्जेक्टआईडी प्रकार में कौन से बदलाव किए गए हैं जिन्हें उपरोक्त कोड को बदलने की आवश्यकता होगी। आपको आगे और आगे रूपांतरण के लिए कुछ परीक्षण लिखना चाहिए। – MiddleTommy