2015-01-12 5 views
22

में ऑब्जेक्टआईडी और उसके स्ट्रिंग फॉर्म को संग्रहीत करने के बीच अंतर, मैं मोंगो डीबी के ऑब्जेक्ट आईडी के उपयोग से थोड़ा उलझन में हूं। निश्चित रूप से वे आईडी क्लाइंट-साइड बनाने के लिए बहुत अच्छे हैं जो लगभग निश्चित रूप से अन्य क्लाइंट-साइड निर्मित आईडी के साथ संघर्ष नहीं करते हैं। लेकिन मोंगो उन्हें कुछ विशेष तरीके से स्टोर करने लगता है। आईडी के स्ट्रिंग प्रस्तुति को संग्रहीत करना अलग-अलग ऑब्जेक्ट के रूप में किसी ऑब्जेक्ट आईडी को संग्रहीत करने से है। ऐसा क्यों है?मोंगोडीबी

क्या स्ट्रिंग फॉर्म में ऑब्जेक्ट फॉर्म की सभी समान जानकारी नहीं है? उन दो रूपों को अलग करने के लिए मोंगो इतनी लंबाई क्यों जाती है? उदाहरण के लिए जब मैं फ्रंटएंड से भेजे गए _ids की तुलना करने की कोशिश करता हूं तो यह मुझे खराब कर देता है। मेरा डेटाबेस स्ट्रिंग-फॉर्म आईडी या ऑब्जेक्ट-फॉर्म आईडी को स्टोर करता है या नहीं, और मेरा कोड निश्चित रूप से आंशिक रूप से दोष देने के लिए संगत है, मैं ज्यादातर इसे अजीब बनाने के लिए मोंगो को दोष देता हूं।

क्या मुझे गलत है कि यह अजीब है? मोंगो ऐसा क्यों करता है?

उत्तर

15

मैं, व्यक्तिगत रूप से, आपके कोड को दोष देता हूं। मैं सही तरीके से कोडिंग करके अपने अनुप्रयोगों में इस चरम पर ठीक हो जाता हूं। मैं तुलना करने के लिए कोड में स्ट्रिंग में कनवर्ट करता हूं और मैं सुनिश्चित करता हूं कि ObjectId जैसा दिखने वाला कुछ भी वास्तव में ObjectId के रूप में उपयोग किया जाता है।

यह नोट करना ObjectId (http://docs.mongodb.org/manual/reference/object-id/) है और यह है हेक्स प्रतिनिधित्व के बीच वहाँ तथ्य यह है अंतर का 12 बाइट्स, ObjectId जा रहा है 12 बाइट्स में है कि अच्छा है और यह हेक्स प्रतिनिधित्व 24.

इतना ही नहीं इसके बारे में है किया जा रहा है भंडारण दक्षता लेकिन सूचकांक के बारे में भी; न सिर्फ इसलिए कि वे छोटे हैं, लेकिन ObjectId को विशेष तरीके से उपयोग किया जा सकता है ताकि यह सुनिश्चित किया जा सके कि इंडेक्स के केवल हिस्सों को लोड किया गया हो; उपयोग किए जाने वाले हिस्सों। डालने पर यह सबसे ज्यादा ध्यान देने योग्य हो जाता है, जहां विशिष्टता सुनिश्चित करने के लिए उस सूचकांक का केवल नवीनतम भाग लोड किया जाना चाहिए। आप अपने हेक्स प्रतिनिधित्व के साथ इस तरह के व्यवहार की गारंटी नहीं दे सकते।

मैं दृढ़ता से अनुशंसा करता हूं कि आप OjbectId के हेक्स प्रतिनिधित्व का उपयोग न करें। यदि आप "अपने जीवन को आसान बनाना चाहते हैं" तो आप अलग-अलग _id बनाने से बेहतर होंगे जो कि छोटा है लेकिन किसी भी तरह अद्वितीय और इंडेक्स अनुकूल है।

+0

आपको ऑब्जेक्ट आईडी को उनकी तुलना करने के लिए तारों में कनवर्ट करने की आवश्यकता नहीं है। उनके पास बराबर विधि होती है (कम से कम मोंगो देशी/मोंगोस्किन में)। –

+0

आपके द्वारा संदर्भित संदर्भ में कहा गया है कि ऑब्जेक्टआईड्स 12 बाइट्स हैं, 16 –

+0

@BT मेरी बुराई, कुछ और सोचने के लिए – Sammaye

3

ObjectId 12 बाइट्स है जब यह आंतरिक रूप से संग्रहीत होता है, जो हेक्साडेसिमल स्ट्रिंग प्रस्तुतीकरण से अधिक कॉम्पैक्ट होता है। दोनों अलग-अलग चीजें हैं।

आप अपने पूरे डीबी को रीफ्लो कर सकते हैं और इसे हल करने के लिए एक समान _id फ़ील्ड का उपयोग कर सकते हैं और सुनिश्चित कर सकते हैं कि आपका कोड उसी प्रारूप में सहेजता है। ObjectId मोंगोडीबी द्वारा उत्पन्न करने के लिए तेज़ी से हैं इसलिए मैं नए दस्तावेज़ बनाते समय इसका उपयोग करूंगा।

+0

आह तो यह सब भंडारण दक्षता के बारे में तब है? मेरे सभी _ids ऑब्जेक्ट आईडी हैं, लेकिन बहुत सारे संदर्भ फ़ील्ड अभी नहीं हैं, मुझे लगता है कि मुझे –

+1

चीजों को ठीक करना चाहिए फ़ील्ड आकार इंडेक्सिंग/क्वेरीिंग प्रदर्शन को भी प्रभावित कर सकता है (सुनिश्चित नहीं है कि 'ऑब्जेक्टआईडी' बनाम 'ऑब्जेक्टआईडी.स्ट्र' ', लेकिन मोंगोडीबी शायद ऑब्जेक्टआईडी के साथ बनाया/परीक्षण किया गया था, तो चलिए इसका उपयोग करते हैं: डी) – bakkal

+0

यह वास्तव में बहुत परेशान है क्योंकि ऑब्जेक्ट आईडी को क्रमबद्ध करने का कोई वास्तविक अच्छा तरीका नहीं है। ऑब्जेक्ट आईडी के साथ स्ट्रिंग आईडी को प्रतिस्थापित करने के लिए क्लाइंट से आने वाले किसी भी अनुरोध को स्पष्ट रूप से कॉम्बेड किया जाना चाहिए। क्या उसके आस-पास कोई रास्ता है? –