MongoDB - ऑटो-इन्क्रीमेंट अनुक्रम

MongoDB में SQL डेटाबेस की तरह आउट-ऑफ-द-बॉक्स ऑटो-इंक्रीमेंट कार्यक्षमता नहीं है। डिफ़ॉल्ट रूप से, यह के लिए 12-बाइट ObjectId का उपयोग करता है_idदस्तावेजों की विशिष्ट पहचान करने के लिए प्राथमिक कुंजी के रूप में फ़ील्ड। हालाँकि, ऐसे परिदृश्य हो सकते हैं जहाँ हम चाहते हैं कि _id फ़ील्ड में ObjectId के अलावा कुछ ऑटो-इन्क्रिम्ड वैल्यू हो।

चूंकि यह MongoDB में एक डिफ़ॉल्ट विशेषता नहीं है, इसलिए हम प्रोग्रामेटिक रूप से इस कार्यक्षमता का उपयोग करके प्राप्त करेंगे counters MongoDB प्रलेखन द्वारा सुझाए अनुसार संग्रह।

काउंटर कलेक्शन का उपयोग करना

निम्नलिखित को धयान मे रखते हुए productsदस्तावेज़। हम चाहते हैं कि _id क्षेत्र एauto-incremented integer sequence 1,2,3,4 से शुरू होकर n तक।

{
  "_id":1,
  "product_name": "Apple iPhone",
  "category": "mobiles"
}

इसके लिए a बनाएं counters संग्रह, जो सभी अनुक्रम क्षेत्रों के लिए अंतिम अनुक्रम मान का ट्रैक रखेगा।

>db.createCollection("counters")

अब, हम काउंटर्स कलेक्शन में निम्नलिखित दस्तावेज़ को सम्मिलित करेंगे productid इसकी कुंजी के रूप में -

> db.counters.insert({
	"_id":"productid",
	"sequence_value": 0
})
WriteResult({ "nInserted" : 1 })
>

मैदान sequence_value अनुक्रम के अंतिम मूल्य का ट्रैक रखता है।

काउंटर अनुक्रम में इस अनुक्रम दस्तावेज़ को सम्मिलित करने के लिए निम्नलिखित कोड का उपयोग करें -

>db.counters.insert({_id:"productid",sequence_value:0})

जावास्क्रिप्ट फ़ंक्शन बनाना

अब, हम एक फंक्शन बनाएंगे getNextSequenceValueजो अनुक्रम नाम को इसके इनपुट के रूप में लेगा, अनुक्रम संख्या को 1 से बढ़ाएगा और अद्यतन अनुक्रम संख्या को वापस करेगा। हमारे मामले में, अनुक्रम नाम हैproductid

>function getNextSequenceValue(sequenceName){
   var sequenceDocument = db.counters.findAndModify({
      query:{_id: sequenceName },
      update: {$inc:{sequence_value:1}},
      new:true
   });
   return sequenceDocument.sequence_value;
}

जावास्क्रिप्ट फ़ंक्शन का उपयोग करना

अब हम नए दस्तावेज़ बनाते समय और दिए गए अनुक्रम मान को दस्तावेज़ के _s फ़ील्ड के रूप में निर्दिष्ट करते हुए फ़ंक्शन getNextSequenceValue का उपयोग करेंगे।

निम्नलिखित कोड का उपयोग करके दो नमूना दस्तावेज़ डालें -

>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Apple iPhone",
   "category":"mobiles"
})
>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Samsung S3",
   "category":"mobiles"
})

जैसा कि आप देख सकते हैं, हमने _Nid फ़ील्ड के लिए मान सेट करने के लिए getNextSequenceValue फ़ंक्शन का उपयोग किया है।

कार्यक्षमता को सत्यापित करने के लिए, हमें खोज आदेश का उपयोग करके दस्तावेज़ लाने हैं -

>db.products.find()

उपरोक्त क्वेरी ने ऑटो-इंक्रीमेंट वाले _id फ़ील्ड में निम्नलिखित दस्तावेज़ लौटाए -

{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}
{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }