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 ???} ) |
| 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參數要與計數器集合中_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." } |
都調用該方法,那么調用這些方法在執行更新操作之前必須先完成查詢操作,而且這些方法能插入相同的文檔。
在計數器事例中,查詢字段是_id字段,它總是有一個獨立的索引。我們再看如下示例:
?| 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()方法將會成功插入一條文檔;
0個或多個findandmodify()方法將會更新新插入的文件;
當它們試圖插入重復的數據時,0個或多個findandmodify()方法;
如果由于違反了唯一約束而導致方法失敗,請重試。
Optimistic Loop
略。
來源:http://blog.csdn.net/younger_z/article/details/53484779
總結
以上是生活随笔為你收集整理的MongoDB学习笔记一ID自增长的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北奔重卡车辆正常启动+车身抖动过大怎么回
- 下一篇: 汽修学习需要多久才能出师? 详解汽修学习