MongoDB - Otomatik Artış Dizisi

MongoDB, SQL veritabanları gibi kullanıma hazır otomatik artış işlevine sahip değildir. Varsayılan olarak, 12 baytlık ObjectId'yi kullanır._idalanı, belgeleri benzersiz şekilde tanımlamak için birincil anahtar olarak kullanın. Ancak, _id alanının ObjectId dışında otomatik olarak artırılmış bir değere sahip olmasını isteyebileceğimiz senaryolar olabilir.

Bu MongoDB'de varsayılan bir özellik olmadığından, bu işlevi programlı olarak bir counters MongoDB belgelerinde önerildiği gibi toplama.

Sayaç Toplamayı Kullanma

Aşağıdakileri göz önünde bulundur productsbelge. _İd alanının birauto-incremented integer sequence 1,2,3,4'ten n'ye kadar.

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

Bunun için bir counters koleksiyon, tüm sıra alanları için son sıra değerini takip edecek.

>db.createCollection("counters")

Şimdi, aşağıdaki belgeyi sayaç koleksiyonuna ekleyeceğiz. productid anahtarı olarak -

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

Alan sequence_value dizinin son değerini takip eder.

Bu sıra belgesini sayaç koleksiyonuna eklemek için aşağıdaki kodu kullanın -

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

Javascript Fonksiyonu Oluşturuluyor

Şimdi bir fonksiyon oluşturacağız getNextSequenceValuesıra adını girdi olarak alacak, sıra numarasını 1 artıracak ve güncellenmiş sıra numarasını döndürecektir. Bizim durumumuzda, sıra adıproductid.

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

Javascript İşlevini Kullanma

Şimdi yeni bir belge oluştururken ve döndürülen sıra değerini belgenin _id alanı olarak atarken getNextSequenceValue işlevini kullanacağız.

Aşağıdaki kodu kullanarak iki örnek belge ekleyin -

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

Gördüğünüz gibi, _id alanı için değer ayarlamak için getNextSequenceValue işlevini kullandık.

İşlevselliği doğrulamak için, belgeleri bul komutunu kullanarak getirelim -

>db.products.find()

Yukarıdaki sorgu, otomatik olarak artırılmış _id alanına sahip aşağıdaki belgeleri döndürdü -

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