MongoDB - Urutan Penambahan Otomatis

MongoDB tidak memiliki fungsionalitas penambahan otomatis out-of-the-box, seperti database SQL. Secara default, ini menggunakan ObjectId 12-byte untuk file_idlapangan sebagai kunci utama untuk mengidentifikasi dokumen secara unik. Namun, mungkin ada skenario di mana kita mungkin ingin bidang _id memiliki beberapa nilai auto-increment selain ObjectId.

Karena ini bukan fitur default di MongoDB, kami secara terprogram akan mencapai fungsionalitas ini dengan menggunakan file counters koleksi seperti yang disarankan oleh dokumentasi MongoDB.

Menggunakan Counter Collection

Simak berikut ini productsdokumen. Kami ingin bidang _id menjadiauto-incremented integer sequence mulai dari 1,2,3,4 hingga n.

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

Untuk ini, buat file counters collection, yang akan melacak nilai urutan terakhir untuk semua bidang urutan.

>db.createCollection("counters")

Sekarang, kita akan memasukkan dokumen berikut ke dalam koleksi penghitung productid sebagai kuncinya -

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

Lapangan sequence_value melacak nilai terakhir dari urutan.

Gunakan kode berikut untuk memasukkan dokumen urutan ini di koleksi penghitung -

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

Membuat Fungsi Javascript

Sekarang, kita akan membuat sebuah fungsi getNextSequenceValueyang akan mengambil nama urutan sebagai masukannya, menambah nomor urutan dengan 1 dan mengembalikan nomor urutan yang diperbarui. Dalam kasus kami, nama urutannya adalahproductid.

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

Menggunakan Fungsi Javascript

Kita sekarang akan menggunakan fungsi getNextSequenceValue saat membuat dokumen baru dan menetapkan nilai urutan yang dikembalikan sebagai bidang _id dokumen.

Masukkan dua dokumen contoh menggunakan kode berikut -

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

Seperti yang Anda lihat, kami telah menggunakan fungsi getNextSequenceValue untuk menyetel nilai bidang _id.

Untuk memverifikasi fungsinya, mari kita ambil dokumen menggunakan perintah find -

>db.products.find()

Kueri di atas mengembalikan dokumen berikut yang memiliki bidang _id bertambah otomatis -

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