MongoDB 欄位增長

來源:互聯網
上載者:User

標籤:

MongoDB中儲存的文檔必須有一個"_id"鍵。這個鍵的值可以是任何類型的,預設是個ObjectId對象。

ObjectId 是一個12位元組 BSON 類型資料,有以下格式:

  • 前4個位元組表示時間戳記
  • 接下來的3個位元組是機器標識碼
  • 緊接的兩個位元組由進程id組成(PID)
  • 最後三個位元組是隨機數。

在一個集合裡面,每個集合都有唯一的"_id"值,來確保集合裡面每個文檔都能被唯一標識。

MongoDB採用ObjectId,而不是其他比較常規的做法(比如自動增加的主鍵)的主要原因,因為在多個 伺服器上同步自動增加主索引值既費力還費時。

雖然MongoDB 沒有像 SQL 一樣有自動成長的功能, 但在某些情況下,我們可能需要實現 ObjectId 自動成長功能。

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

使用 counters 集合

考慮以下 products 文檔。我們希望 _id 欄位實現 從 1,2,3,4 到 n 的自動成長功能。為此,建立 counters 集合,序欄欄位值可以實現自動長

>db.createCollection("counters")

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.prodcuts.find()

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

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

 

ObjectId 是一個12位元組 BSON 類型資料,有以下格式:

  • 前4個位元組表示時間戳記
  • 接下來的3個位元組是機器標識碼
  • 緊接的兩個位元組由進程id組成(PID)
  • 最後三個位元組是隨機數。

MongoDB中儲存的文檔必須有一個"_id"鍵。這個鍵的值可以是任何類型的,預設是個ObjectId對象。

在一個集合裡面,每個集合都有唯一的"_id"值,來確保集合裡面每個文檔都能被唯一標識。

MongoDB採用ObjectId,而不是其他比較常規的做法(比如自動增加的主鍵)的主要原因,因為在多個 伺服器上同步自動增加主索引值既費力還費時。

MongoDB 欄位增長

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.