1. अवलोकन
कभी-कभी, हमें उस दस्तावेज़ की आईडी की आवश्यकता होती है जिसे हमने अभी-अभी MongoDB डेटाबेस में डाला है। उदाहरण के लिए, हम किसी कॉलर को प्रतिक्रिया के रूप में आईडी वापस भेजना चाहते हैं या डिबगिंग के लिए बनाई गई वस्तु को लॉग करना चाहते हैं।
इस ट्यूटोरियल में, हम देखेंगे कि कैसे ID को MongoDB में कार्यान्वित किया जाता है और एक दस्तावेज़ की ID को कैसे पुनः प्राप्त किया जाए जिसे हमने अभी-अभी एक Java प्रोग्राम के माध्यम से एक संग्रह में डाला है।
2. MongoDB दस्तावेज़ की आईडी क्या है?
प्रत्येक डेटा संग्रहण प्रणाली की तरह, MongoDB को संग्रह में संग्रहीत प्रत्येक दस्तावेज़ के लिए एक विशिष्ट पहचानकर्ता की आवश्यकता होती है। यह पहचानकर्ता संबंधपरक डेटाबेस में प्राथमिक कुंजी के बराबर है।
MongoDB में, यह आईडी 12 बाइट्स से बनी होती है:
- एक 4-बाइट टाइमस्टैम्प मान यूनिक्स युग के बाद के सेकंड का प्रतिनिधित्व करता है
- एक 5-बाइट यादृच्छिक मान प्रति प्रक्रिया एक बार उत्पन्न होता है। यह यादृच्छिक मान मशीन और प्रक्रिया के लिए अद्वितीय है।
- एक 3-बाइट इंक्रीमेंटिंग काउंटर
आईडी _id . नामक फ़ील्ड में संग्रहीत है और क्लाइंट द्वारा उत्पन्न किया जाता है। इसका मतलब है कि डेटाबेस को दस्तावेज़ भेजने से पहले आईडी को जनरेट करना होगा। क्लाइंट की ओर से, हम या तो ड्राइवर-जनरेटेड आईडी का उपयोग कर सकते हैं या कस्टम आईडी जेनरेट कर सकते हैं।
हम देख सकते हैं कि एक ही क्लाइंट द्वारा एक ही सेकंड में बनाए गए दस्तावेज़ों में पहले 9 बाइट्स समान होंगे। इसलिए, आईडी की विशिष्टता इस मामले में काउंटर पर निर्भर करती है। काउंटर क्लाइंट को एक ही सेकंड में 16 मिलियन से अधिक दस्तावेज़ बनाने देता है।
हालांकि यह टाइमस्टैम्प से शुरू होता है, हमें सावधान रहना चाहिए कि पहचानकर्ता का उपयोग सॉर्टिंग मानदंड के रूप में नहीं किया जाता है। ऐसा इसलिए है क्योंकि एक ही सेकंड में बनाए गए दस्तावेज़ों को निर्माण तिथि के अनुसार क्रमबद्ध करने की गारंटी नहीं है, क्योंकि काउंटर के मोनोटोनिक होने की गारंटी नहीं है। साथ ही, अलग-अलग क्लाइंट के पास अलग-अलग सिस्टम क्लॉक हो सकते हैं।
जावा ड्राइवर काउंटर के लिए एक यादृच्छिक संख्या जनरेटर का उपयोग करता है, जो मोनोटोनिक नहीं है। इसलिए हमें निर्माण तिथि के अनुसार क्रमित करने के लिए ड्राइवर-जनरेटेड आईडी का उपयोग नहीं करना चाहिए।
3. ऑब्जेक्ट आईडी कक्षा
विशिष्ट पहचानकर्ता एक ObjectId . में संग्रहीत होता है वर्ग जो आईडी में डेटा को मैन्युअल रूप से पार्स किए बिना संग्रहीत करने के लिए सुविधाजनक तरीके प्रदान करता है।
उदाहरण के लिए, यहां बताया गया है कि हम आईडी के निर्माण की तारीख कैसे प्राप्त कर सकते हैं:
Date creationDate = objectId.getDate();
इसी तरह, हम सेकंड में आईडी का टाइमस्टैम्प पुनः प्राप्त कर सकते हैं:
int timestamp = objectId.getTimestamp();
ऑब्जेक्ट आईडी वर्ग काउंटर, मशीन पहचानकर्ता, या प्रक्रिया पहचानकर्ता प्राप्त करने के तरीके भी प्रदान करता है, लेकिन वे सभी बहिष्कृत हैं।
4. आईडी पुनः प्राप्त करना
याद रखने वाली मुख्य बात यह है कि, MongoDB में, क्लाइंट दस्तावेज़ का विशिष्ट पहचानकर्ता बनाता है इसे क्लस्टर में भेजने से पहले। यह संबंधपरक डेटाबेस में अनुक्रमों के विपरीत है। यह इस आईडी की पुनर्प्राप्ति को काफी आसान बनाता है।
4.1. ड्राइवर-जनरेटेड आईडी
किसी दस्तावेज़ की विशिष्ट आईडी जेनरेट करने का मानक और आसान तरीका ड्राइवर को काम करने देना है। जब हम एक नया दस्तावेज़ डालते हैं एक संग्रह . के लिए , अगर नहीं _id दस्तावेज़ . में फ़ील्ड मौजूद है , ड्राइवर एक नया ObjectId . उत्पन्न करता है क्लस्टर में इन्सर्ट कमांड भेजने से पहले।
एक नया दस्तावेज़ डालने के लिए हमारा कोड आपके संग्रह में ऐसा दिखाई दे सकता है:
Document document = new Document();
document.put("name", "Shubham");
document.put("company", "Baeldung");
collection.insertOne(document);
हम देख सकते हैं कि हम यह कभी नहीं बताते कि आईडी कैसे जनरेट की जानी चाहिए।
जब insertOne() विधि रिटर्न, हम उत्पन्न ObjectId . प्राप्त कर सकते हैं दस्तावेज़ . से :
ObjectId objectId = document.getObjectId("_id");
हम ObjectId . को भी पुनः प्राप्त कर सकते हैं दस्तावेज़ . के मानक फ़ील्ड की तरह और फिर उसे ObjectId . पर कास्ट करें :
ObjectId oId = (ObjectId) document.get("_id");
4.2. कस्टम आईडी
आईडी को पुनः प्राप्त करने का दूसरा तरीका यह है कि इसे हमारे कोड में जनरेट करें और इसे दस्तावेज़ में डालें किसी भी अन्य क्षेत्र की तरह। अगर हम दस्तावेज़ भेजते हैं एक _id . के साथ ड्राइवर के लिए फ़ील्ड, यह एक नया उत्पन्न नहीं करेगा।
हमें कुछ मामलों में इसकी आवश्यकता हो सकती है जहां हमें MongoDB दस्तावेज़ . की आईडी की आवश्यकता होती है दस्तावेज़ . डालने से पहले संग्रह . में ।
हम एक नया ObjectId उत्पन्न कर सकते हैं कक्षा का एक नया उदाहरण बनाकर:
ObjectId generatedId = new ObjectId();
या, हम स्थिर get() . को भी लागू कर सकते हैं ObjectId . की विधि कक्षा:
ObjectId generatedId = ObjectId.get();
फिर, हमें बस अपना दस्तावेज़ . बनाना होगा और उत्पन्न आईडी का उपयोग करें। ऐसा करने के लिए, हम इसे दस्तावेज़ . में प्रदान कर सकते हैं कंस्ट्रक्टर:
Document document = new Document("_id", generatedId);
वैकल्पिक रूप से, हम put() . का उपयोग कर सकते हैं विधि:
document.put("_id", generatedId);
उपयोगकर्ता-जनित आईडी का उपयोग करते समय, हमें एक नया ऑब्जेक्ट आईडी . उत्पन्न करने के लिए सावधान रहना चाहिए प्रत्येक प्रविष्टि से पहले, डुप्लिकेट आईडी के रूप में मना किया जाता है। डुप्लीकेट आईडी के परिणामस्वरूप MongoWriteException होगा डुप्लीकेट कुंजी संदेश के साथ।
ऑब्जेक्ट आईडी क्लास कई अन्य कंस्ट्रक्टर प्रदान करता है जो हमें पहचानकर्ता के कुछ हिस्सों को सेट करने की अनुमति देता है:
public ObjectId(final Date date)
public ObjectId(final Date date, final int counter)
public ObjectId(final int timestamp, final int counter)
public ObjectId(final String hexString)
public ObjectId(final byte[] bytes)
public ObjectId(final ByteBuffer buffer)
लेकिन, जब हम उन कंस्ट्रक्टर्स का उपयोग करते हैं तो हमें बहुत सावधान रहना चाहिए क्योंकि ड्राइवर को प्रदान की गई आईडी की विशिष्टता पूरी तरह से हमारे कोड पर निर्भर करती है। हम इन विशेष मामलों में डुप्लिकेट कुंजियों की त्रुटि प्राप्त कर सकते हैं:
- अगर हम एक ही तारीख (या टाइमस्टैम्प) और काउंटर कॉम्बो का कई बार इस्तेमाल करते हैं
- यदि हम एक ही हेक्साडेसिमल का उपयोग करते हैं स्ट्रिंग , बाइट सरणी, या बाइटबफ़र कई बार