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" }