MongoDB 教學課程login
MongoDB 教學課程
作者:php.cn  更新時間:2022-04-21 17:49:03

MongoDB 自動成長


MongoDB 沒有像 SQL 一樣有自動成長的功能, MongoDB 的 _id 是系統自動產生的12位元組唯一識別。

但在某些情況下,我們可能需要實作 ObjectId 自動成長功能。

由於 MongoDB 沒有實現這個功能,我們可以透過程式設計的方式來實現,以下我們將在 counters 集合中實現_id欄位自動增長。


使用 counters 集合

考慮以下 products 文件。我們希望 _id 字段實現 從  1,2,3,4 到 n 的自動成長功能。

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

為此,建立counters 集合,序列欄位值可以實現自動長:

>db.createCollection("counters")

現在我們向counters 集合中插入以下文檔,使用productid 作為key:

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

sequence_value 欄位是序列通過自動增長後的一個值。

使用下列指令插入 counters 集合的序列文件中:

>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 欄位。

為了驗證函數是否有效,我們可以使用以下命令讀取文件:

>db.products.find()

以上命令將傳回以下結果,我們發現_id 欄位是自增長的:

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

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

PHP中文網