Mongodb自增id實(shí)現(xiàn)方法
本文實(shí)例講述了Mongodb自增id實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
首先創(chuàng)建一個(gè)自動(dòng)增長(zhǎng)id集合 ids
>db.ids.save({name:"user", id:0});
可以查看一下是否成功
> db.ids.find();
{ "_id" : ObjectId("4c637dbd900f00000000686c"), "name" : "user", "id" : 0 }
然后每次添加新用戶之前自增一下 ids集合 獲得id
然后每次在db.user集合里添加新用戶之前 在db.ids集合中的name="user"文檔的id值加1返回文檔
>userid = db.ids .findAndModify({update:{$inc:{'id':1}}, query:{"name":"user"}, new:true});
{ "_id" : ObjectId("4c637dbd900f00000000686c"), "name" : "user", "id" : 1 }
注:因?yàn)閒indAndModify是一個(gè)方法完成更新查找兩個(gè)操作,所以具有原子性,多線程不會(huì)沖突。
然后保存相應(yīng)的數(shù)據(jù)
>db.user .save({uid:userid.id, username:"dotcoo", password:"dotcoo", info:"http://www.dhdzp.com/ "});
// --------- update 2011-03-27 13:11 ------------------------
其實(shí)上邊兩行可以寫為一步
>db.user .save({
uid: db.ids .findAndModify({
update:{$inc:{'id':1}},
query:{"name":"user"},
new:true}).id, //讓db.ids集合中的name="user"文檔的id值加1并返回充當(dāng)自增id
username: "dotcoo",
password:"dotcoo",
info:"http://www.dhdzp.com/ "});
// --------- update 2011-03-27 13:11 ------------------------
查看結(jié)果
> db.user.find();
{ "_id" : ObjectId("4c637f79900f00000000686d"), "uid" : 1, "username" : "admin", "password" : "admin" }
這是mongo的shell,如果用的是服務(wù)器端程序Java php Python,可以自己對(duì)這些操作封裝一下,只用傳幾個(gè)參數(shù)就可以返回自增的id,還可以實(shí)現(xiàn)像Oracle的跨表的自增id。
自己寫了一段php的,拿出來(lái)給大家分享。
<?php
function mid($name, $db){
$update = array('$inc'=>array("id"=>1));
$query = array('name'=>$name);
$command = array(
'findandmodify'=>'ids', 'update'=>$update,
'query'=>$query, 'new'=>true, 'upsert'=>true
);
$id = $db->command($command);
return $id['value']['id'];
}
$conn = new Mongo();
$db = $conn->idtest;
$id = mid('user', $db);
$db->user->save(array('uid'=>$id, 'username'=>'kekeles', 'password'=>'kekeles', 'info'=>'http://www.dhdzp.com/ '));
$conn->close();
?>
其具體實(shí)現(xiàn)方式主要是利用MongoDB中findAndModify命令,只要每次往MongoDB里insert對(duì)象前生成ID賦值給_id就OK了,因?yàn)樗膶?shí)現(xiàn)滿足原子性,所以不存在并發(fā)問(wèn)題。
另外說(shuō)明一點(diǎn),findAndModify本身提供了一個(gè)upsert參數(shù),為true的話可以自動(dòng)insert,但那樣就不能自定義初始值了,所以文中示例沒有使用upsert。
BTW,數(shù)據(jù)庫(kù)“_seq”的名字以下劃線開頭,這樣列表的時(shí)候會(huì)排在前面,容易分辨。
希望本文所述對(duì)大家MongoDB數(shù)據(jù)庫(kù)程序設(shè)計(jì)有所幫助。
相關(guān)文章
MongoDB安裝及接入springboot的詳細(xì)過(guò)程
MongoDB是一個(gè)開源、高性能、無(wú)模式(模式自由)的文檔(Bson)型數(shù)據(jù)庫(kù),這篇文章主要介紹了MongoDB安裝及接入springboot,需要的朋友可以參考下2024-05-05
mongodb 中rs.stauts()命令參數(shù)解析
MongoDB的rs.status()命令是查看副本集狀態(tài)的重要工具,它可以展示副本集中各個(gè)成員的角色、健康狀態(tài)、同步進(jìn)度等關(guān)鍵信息,本文介紹mongodb 中rs.stauts()命令參數(shù)解析,感興趣的朋友跟隨小編一起看看吧2024-09-09
MongoDB連接和創(chuàng)建數(shù)據(jù)庫(kù)的方法講解
這篇文章介紹了MongoDB連接和創(chuàng)建數(shù)據(jù)庫(kù)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03
淺談MySQL和MariaDB區(qū)別(mariadb和mysql的性能比較)
MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能輕松成為MySQL的代替品2018-02-02
MongoDB學(xué)習(xí)筆記之GridFS使用介紹
這篇文章主要介紹了MongoDB學(xué)習(xí)筆記之GridFS使用介紹,本文介紹了GridFS的作用、GridFS的一些使用方法、GridFS實(shí)現(xiàn)原理及注意事項(xiàng)等,需要的朋友可以參考下2015-07-07
老生常談MongoDB數(shù)據(jù)庫(kù)基礎(chǔ)操作
下面小編就為大家?guī)?lái)一篇老生常談MongoDB數(shù)據(jù)庫(kù)基礎(chǔ)操作。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
MongoDB快速入門筆記(二)之MongoDB的概念及簡(jiǎn)單操作
MongoDB是面向集合的文檔式數(shù)據(jù)庫(kù),不像關(guān)系數(shù)據(jù)庫(kù)那樣,有表,列、行,mongoDB數(shù)據(jù)庫(kù)則是由一系列的文檔組成。接下來(lái)通過(guò)本文給大家介紹MongoDB的概念及簡(jiǎn)單操作,一起看看吧2016-06-06

