आपको विकल्प 1 के साथ जाना चाहिए।
मुख्य कारण यह है कि आप कहते हैं कि आप प्रदर्शन के बारे में चिंतित हैं - _id अनुक्रमणिका का उपयोग करना जो हमेशा मौजूद है और पहले से ही अद्वितीय है, आपको दूसरी अनूठी अनुक्रमणिका बनाए रखने के लिए बचत करने की अनुमति देगा।
<ब्लॉकक्वॉट>विकल्प 1 के लिए, मैं गैर अनुक्रमिक कुंजी रखने के लिए सम्मिलित प्रदर्शन के बारे में चिंतित हूं। मुझे पता है कि यह पारंपरिक आरडीबीएमएस सिस्टम को मार सकता है और मैंने संकेत देखे हैं कि यह मोंगोडीबी में भी सच हो सकता है।
आपके अन्य विकल्प इस समस्या से नहीं बचते हैं, वे इसे _id अनुक्रमणिका से द्वितीयक अद्वितीय अनुक्रमणिका में स्थानांतरित कर देते हैं - लेकिन अब आपके पास दो अनुक्रमणिकाएं हैं, एक बार वह सही-संतुलित है और दूसरी यादृच्छिक अभिगम है।
विकल्प 1 पर सवाल उठाने का केवल एक कारण है और वह यह है कि यदि आप दस्तावेजों को केवल एक या अन्य यूयूआईडी मान से एक्सेस करने की योजना बना रहे हैं। जब तक आप हमेशा दोनों मान प्रदान कर रहे हैं और (यह हिस्सा बहुत महत्वपूर्ण है) आप हमेशा उन्हें अपने सभी प्रश्नों में उसी तरह से आदेश देते हैं, तब _id अनुक्रमणिका कुशलतापूर्वक अपने पूर्ण उद्देश्य की पूर्ति करेगी।
उप-दस्तावेजों की तुलना करते समय आपको यह सुनिश्चित करने की आवश्यकता क्यों है कि आप हमेशा दो यूयूआईडी मानों को उसी तरह से ऑर्डर करते हैं { a:1, b:2 }
{ b:2, a:1 }
. के बराबर नहीं है - आपके पास एक संग्रह हो सकता है जहां दो दस्तावेज़ों में _id के लिए वे मान थे। इसलिए यदि आप _id को पहले फ़ील्ड के साथ संग्रहीत करते हैं, तो आपको अपने सभी दस्तावेज़ों और प्रश्नों में उस आदेश को हमेशा रखना चाहिए।
दूसरी सावधानी यह है कि _id:1
. पर अनुक्रमणिका क्वेरी के लिए प्रयोग करने योग्य होगा:
db.collection.find({_id:{a:1,b:2}})
लेकिन यह नहीं होगा क्वेरी के लिए प्रयोग करने योग्य हो
db.collection.find({"_id.a":1, "_id.b":2})