天天看點

MongoDB學習筆記一ID自增長

概要

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

db.counters.

insert

(

{

_id:

"userid"

,

seq: 0

}

)

2、建立一個getNextSequence函數,參數為序列的name,函數使用findandmodify()方法去自動增長序列的值并傳回增長之後的結果: ?

1 2 3 4 5 6 7 8 9 10 11

function

getNextSequence(

name

) {

var ret = db.counters.findAndModify(

{

query: { _id:

name

},

update

: { $inc: { seq: 1 } },

new:

true

}

);

return

ret.seq;

}

3、在接下來插入資料的時候,使用getNextSequence這個函數: ?

1 2 3 4 5 6 7 8 9 10 11 12

db.users.

insert

(

{

_id: getNextSequence(

"userid"

),//注意getNextSequence參數要與計數器集合中_id值一緻

name

:

"Sarah C."

}

)

db.users.

insert

(

{

_id: getNextSequence(

"userid"

),

name

:

"Bob D."

}

)

4、你可以試着檢視結果: ?

1

db.users.find()

5、_id字段包含了自動增長序列的值: ?

1 2 3 4 5 6 7 8

{

_id : 1,

name

:

"Sarah C."

}

{

_id : 2,

name

:

"Bob D."

}

findandmodify這個方法包含了更新,查詢字段并不是一定要有唯一索引,該方法可以在某些情況下多次插入同一個文檔。例如,有多個用戶端在使用同樣查詢條件時,

都調用該方法,那麼調用這些方法在執行更新操作之前必須先完成查詢操作,而且這些方法能插入相同的文檔。

在計數器事例中,查詢字段是_id字段,它總是有一個獨立的索引。我們再看如下示例:

?

1 2 3 4 5 6 7 8 9 10 11

function

getNextSequence(

name

) {

var ret = db.counters.findAndModify(

{

query: { _id:

name

},

update

: { $inc: { seq: 1 } },

new:

true

,

upsert:

true

}

);

return

ret.seq;

}

如果多個用戶端在傳入相同參數情況下來調用getNextSequence()方法,然後我們會發現以下其中一個行為将會發生:

一次findandmodify()方法将會成功插入一條文檔;

0個或多個findandmodify()方法将會更新新插入的檔案;

當它們試圖插入重複的資料時,0個或多個findandmodify()方法;

如果由于違反了唯一限制而導緻方法失敗,請重試。

Optimistic Loop

略。