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

 參見:http://www.cnblogs.com/wangjing666/p/6845294.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM