概要
MongoDB 的_id字段作為一個主鍵存在于所有文檔的最頂層,_id必須是唯一的,而且總是具有唯一限制的索引。除了唯一限制,你可以在集合中的_id字段上使用任何值,
以下這個指南描述了在_id上建立一個自增序列的兩種方式:
Use Counter Collection
Optimistic Loop
注意事項
一般情況下,你不會願意在_id字段,或任何字段上使用自增模式,那是因為不會有大量的文檔構成的大規模資料庫,通常情況下,更為理想的是預設_id。
實作過程
Use Counter Collection
Counter集合實作:
利用一個單獨的計數器集合去跟蹤我們使用的最後一個數字序列。該_id字段包含了序列名稱和序列字段中該序列最後的值。
1、插入計數器集合,設定初始值為userid:
?
1 2 3 4 5 6 | |
2、建立一個getNextSequence函數,參數為序列的name,函數使用findandmodify()方法去自動增長序列的值并傳回增長之後的結果: ?
1 2 3 4 5 6 7 8 9 10 11 | |
3、在接下來插入資料的時候,使用getNextSequence這個函數: ?
1 2 3 4 5 6 7 8 9 10 11 12 | |
4、你可以試着檢視結果: ?
1 | |
5、_id字段包含了自動增長序列的值: ?
1 2 3 4 5 6 7 8 | |
findandmodify這個方法包含了更新,查詢字段并不是一定要有唯一索引,該方法可以在某些情況下多次插入同一個文檔。例如,有多個用戶端在使用同樣查詢條件時,
都調用該方法,那麼調用這些方法在執行更新操作之前必須先完成查詢操作,而且這些方法能插入相同的文檔。
在計數器事例中,查詢字段是_id字段,它總是有一個獨立的索引。我們再看如下示例:
?
1 2 3 4 5 6 7 8 9 10 11 | |
如果多個用戶端在傳入相同參數情況下來調用getNextSequence()方法,然後我們會發現以下其中一個行為将會發生:
一次findandmodify()方法将會成功插入一條文檔;
0個或多個findandmodify()方法将會更新新插入的檔案;
當它們試圖插入重複的資料時,0個或多個findandmodify()方法;
如果由于違反了唯一限制而導緻方法失敗,請重試。
Optimistic Loop
略。