- MongoDB 教程
- MongoDB - 首頁
- MongoDB - 概述
- MongoDB - 優點
- MongoDB - 環境
- MongoDB - 資料建模
- MongoDB - 建立資料庫
- MongoDB - 刪除資料庫
- MongoDB - 建立集合
- MongoDB - 刪除集合
- MongoDB - 資料型別
- MongoDB - 插入文件
- MongoDB - 查詢文件
- MongoDB - 更新文件
- MongoDB - 刪除文件
- MongoDB - 投影
- MongoDB - 限制記錄
- MongoDB - 排序記錄
- MongoDB - 索引
- MongoDB - 聚合
- MongoDB - 複製
- MongoDB - 分片
- MongoDB - 建立備份
- MongoDB - 部署
- MongoDB - Java
- MongoDB - PHP
- 高階 MongoDB
- MongoDB - 關係
- MongoDB - 資料庫引用
- MongoDB - 覆蓋查詢
- MongoDB - 分析查詢
- MongoDB - 原子操作
- MongoDB - 高階索引
- MongoDB - 索引限制
- MongoDB - ObjectId
- MongoDB - Map Reduce
- MongoDB - 文字搜尋
- MongoDB - 正則表示式
- 使用 Rockmongo
- MongoDB - GridFS
- MongoDB - 有帽集合
- 自動遞增序列
- MongoDB 有用資源
- MongoDB - 問題和解答
- MongoDB - 快速指南
- 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 作為其鍵 -
> 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" }
廣告