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 作為其鍵 -

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

欄位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 函式

現在,我們在建立新文件並將其返回的序列值分配為文件的 _id 欄位時,將使用函式 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"
})

如您所見,我們使用了 getNextSequenceValue 函式來設定 _id 欄位的值。

為了驗證功能,讓我們使用 find 命令獲取文件 -

>db.products.find()

上述查詢返回了以下具有自動遞增 _id 欄位的文件 -

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