位置:首頁 > 數據庫 > MongoDB教學 > MongoDB自動遞增序列

MongoDB自動遞增序列

MongoDB冇有像SQL數據庫外開箱即用自動遞增功能。默認情況下,它采用了12字節的ObjectId為_id字段作為主鍵來唯一地標識文檔。然而,可能存在的情況,我們可能希望_id字段有一些其它的自動增加值不是ObjectId。

由於這不是MongoDB的默認功能,我們將通過編程通過使用計數器集合,由MongoDB文檔所建議來實現此功能。

使用計數器集合

考慮下麵的產品文檔。我們希望_id字段從1,2,3,4到n,啟動一個自動遞增的整數序列。

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

對於這一點,創建一個計數器集合,將跟蹤的最後一個序列值的所有序列字段。

>db.createCollection("counters")

現在,我們將插入productid作為鍵,計數器集合如以下文檔:

{
  "_id":"productid",
  "sequence_value": 0
}

字段 sequence_value 跟蹤序列的最後一個值。

使用下麵的代碼插入到這個序列文檔的計數器集合:

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

創建JavaScript函數

現在,我們將創建一個函數 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;
}
 

使用JavaScript函數:

現在,我們將使用 getNextSequenceValue 函數創建一個新文檔並指派返回序列值作為文檔的_id字段。

使用下麵的代碼來插入兩個示例文檔:

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

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

正如所看到的,我們已經使用 getNextSequenceValue 函數來設置_id字段的值。

要驗證的功能,讓我們使用find命令來獲取文件:

>db.prodcuts.find()

上述查詢返回下列文檔具有自動遞增_id字段:

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

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