MongoDB学习笔记一ID自增长
概要
MongoDB 的_id字段作為一個(gè)主鍵存在于所有文檔的最頂層,_id必須是唯一的,而且總是具有唯一約束的索引。除了唯一約束,你可以在集合中的_id字段上使用任何值,
以下這個(gè)指南描述了在_id上創(chuàng)建一個(gè)自增序列的兩種方式:
Use Counter Collection
Optimistic Loop
注意事項(xiàng)
一般情況下,你不會(huì)愿意在_id字段,或任何字段上使用自增模式,那是因?yàn)椴粫?huì)有大量的文檔構(gòu)成的大規(guī)模數(shù)據(jù)庫,通常情況下,更為理想的是默認(rèn)_id。
實(shí)現(xiàn)過程
Use Counter Collection
Counter集合實(shí)現(xiàn):
利用一個(gè)單獨(dú)的計(jì)數(shù)器集合去跟蹤我們使用的最后一個(gè)數(shù)字序列。該_id字段包含了序列名稱和序列字段中該序列最后的值。
1、插入計(jì)數(shù)器集合,設(shè)置初始值為userid:
?| 1 2 3 4 5 6 | db.counters.insert( ???{ ??????_id:?"userid", ??????seq: 0 ???} ) |
| 1 2 3 4 5 6 7 8 9 10 11 | functiongetNextSequence(name) { ???var ret = db.counters.findAndModify( ??????????{ ????????????query: { _id:?name}, ????????????update: { $inc: { seq: 1 } }, ????????????new:?true ??????????} ???); ???returnret.seq; } |
| 1 2 3 4 5 6 7 8 9 10 11 12 | db.users.insert( ???{ ?????_id: getNextSequence("userid"),//注意getNextSequence參數(shù)要與計(jì)數(shù)器集合中_id值一致 ?????name:?"Sarah C." ???} ) db.users.insert( ???{ ?????_id: getNextSequence("userid"), ?????name:?"Bob D." ???} ) |
| 1 | db.users.find() |
| 1 2 3 4 5 6 7 8 | { ??_id : 1, ??name:?"Sarah C." } { ??_id : 2, ??name:?"Bob D." } |
都調(diào)用該方法,那么調(diào)用這些方法在執(zhí)行更新操作之前必須先完成查詢操作,而且這些方法能插入相同的文檔。
在計(jì)數(shù)器事例中,查詢字段是_id字段,它總是有一個(gè)獨(dú)立的索引。我們再看如下示例:
?| 1 2 3 4 5 6 7 8 9 10 11 | functiongetNextSequence(name) { ???var ret = db.counters.findAndModify( ??????????{ ????????????query: { _id:?name}, ????????????update: { $inc: { seq: 1 } }, ????????????new:?true, ????????????upsert:?true ??????????} ???); ???returnret.seq; } |
一次findandmodify()方法將會(huì)成功插入一條文檔;
0個(gè)或多個(gè)findandmodify()方法將會(huì)更新新插入的文件;
當(dāng)它們試圖插入重復(fù)的數(shù)據(jù)時(shí),0個(gè)或多個(gè)findandmodify()方法;
如果由于違反了唯一約束而導(dǎo)致方法失敗,請重試。
Optimistic Loop
略。
來源:http://blog.csdn.net/younger_z/article/details/53484779
總結(jié)
以上是生活随笔為你收集整理的MongoDB学习笔记一ID自增长的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北奔重卡车辆正常启动+车身抖动过大怎么回
- 下一篇: 汽修学习需要多久才能出师? 详解汽修学习