y ## 前言
對于數據庫的操作突委,無非就是增刪改查,只有掌握這些基礎的知識我們才能夠好好掌握MongoDB侣集,所以接下來就學習一下最基本的應用增刪改的操作了坛增,查詢的內容已經在上篇文章<a href="http://www.reibang.com/p/9a45413307b4">MongoDB查詢知多少</a>發(fā)布了。
插入語句
與其它的關系型數據庫一樣雕欺,增加記錄可以使用insert語句來完成涎劈,下面來查看一下例子。
db.users.insert({id:1,name:"peter",age:21,email:"veionestudio@outlook.com",phone:"183********"});
tips:
(1)第一次插入數據時阅茶,不需要預先創(chuàng)建一個集合(users)蛛枚,插入數據時它會自動創(chuàng)建這個集合。
(2)每次插入數據時如果沒有顯示指定的字段"_id"脸哀,則會默認創(chuàng)建一個主鍵"_id"蹦浦。在關系數據庫中主鍵大多數是數值類型,而且是自動增長類型的序列撞蜂。而MongoDB中的主鍵值類型則為ObjectId類型盲镶,這樣設計好處是可以更好地支持分布式存儲。其中ObjectId類型的值由12個字節(jié)組成蝌诡,前面4個字節(jié)表示的是一個時間戳溉贿,精確到秒,緊接著的3個字節(jié)表示的是機器唯一標示浦旱,接著2個字節(jié)表示的進程id宇色,最后3個字節(jié)是一個隨機的計數器。
(3)在MongoDB中颁湖,每一個集合都必須有一個"_id"字段宣蠕,不管是自動生成還是指定的,值都是必須唯一的甥捺,如果插入重復值將會拋出異常抢蚀。下面有個小栗子。
db.users.insert({"_id":1,name:"james",phone:"12345678905"});
如果插入同樣的值镰禾,將會拋出以下異常皿曲。
根據錯誤我們可以清楚的知道唱逢,duplicate key error collection,主鍵已經重復了。
修改語句
與關系型數據庫類型屋休,MongoDB修改語句由update完成惶我,只是MongoDB和普通的關系型數據庫有些不同而已〔┩叮總的來說修改分為兩種,一種是只針對具體的目標字段盯蝴,其它不變毅哗;另一種是取代性的更改,即修改具體目標字段后捧挺,其它的字段將會被刪除虑绵。其語法格式如下:
<pre>
db.cooolection.update(query,update,<upsert>,<multi>)
參數說明如下:
query參數是一個查詢選擇器,值類型為document闽烙。
update參數為需要修改的地方翅睛,值類型為document,如果update參數只包括字段選項黑竞,沒有操作符捕发,則會發(fā)生取代性的更改。
upsert為一個可選參數很魂,boolean類型扎酷,默認值為false。當值為true時遏匆,update將會匹配更改內容法挨,如果沒有更新到匹配的內容,則會插入一個新的文檔到集合中幅聘。
multi參數為一個可選的參數凡纳,boolean類型,當為true時帝蒿,update方法將更新素有匹配到的文檔荐糜。
</pre>
下面通過實例代碼來更新操作:
1、更改指定的的字段值
db.user.update({name:"peter"},{$set:{name:"James"},{$inc:{age:22}});
這個操作將會匹配到name:"peter"的第一個文檔葛超,將其中的字段name設為"James"狞尔,字段"age"增加22,其它字段保持不變巩掺。
2偏序、更改指定字段其它字段被清除掉
db.user.update({name:"peter"},{"name":"James"})
這個操作將更改集合中與name:"peter"匹配的第一個文檔,將其中的字段name設置為"James"后胖替,文檔中除了"_id"之外研儒,將全部被清除掉豫缨。
3、更改多個文檔中的指定字段
db.goods.update({name:"surface",,{$set:{price:6999}},{multi:true});
由于利用了可選參數multi,這個操作將更改集合中與name:"surface"匹配的所有文檔端朵,將其中的字段設為6999,其它字段不變好芭。
4、update找不到匹配的文檔時則插入新文檔
db.goods.update({name:"macbook pro"},{$set:{price:12600}},{upsert:true});
因為利用了可選參數upsert冲呢,這個操作如果匹配不到文檔舍败,則會進行插入的操作。
刪除語句
MongoDB中刪除操作remove也是數據庫CRUD操作中最基本的一種敬拓,與關系型數據庫中的delete類型邻薯,語法如下:
<pre>
db.collection.remove(<query>,<justOne>);
參數說明如下:
query參數為可選參數,查詢選擇器乘凸,類似關系型數據庫中的where條件語句厕诡。
justOne參數也是可選參數,是一個boolean值類型营勤,表示是否只輸出匹配的第一個文檔灵嫌,相當于關系型數據庫中的limit 1條件。
有一條需要注意的是:
如果remove沒有指定任何參數葛作,它將刪除集合中的所有文檔寿羞,但是不會刪除集合對應的索引數據。如果想刪除集合中的所有文檔赂蠢,同時也刪除集合的索引稠曼,我們可以使用MongoDB針對集合提供的drop方法。
</pre>
下面舉幾個栗子客年。
1霞幅、刪除匹配的所有文檔
db.goods.remove({name:"macbook pro"});
2、刪除匹配的第一個文檔
db.goods.remove({name:"nokia"});
3量瓜、刪除所有文檔司恳,但不會刪除索引
db.goods.remove();
鎖機制
MongoDB與關心性數據庫類似,也是通過鎖機制來保證數據的完整性和一致性的绍傲。MongoDB利用讀寫鎖來支持并發(fā)操作扔傅,讀鎖可以共享,寫鎖具有排它性烫饼。當一個讀鎖存在時猎塞,其它讀操作也可以用這個讀鎖;但是當一個寫鎖存在時杠纵,其它任何讀寫操作都不能共享這把鎖荠耽,當一個讀和寫都等待一個鎖時,MongoDB將優(yōu)先分配鎖給寫操作比藻。
總結
通過MongoDB的學習铝量,我們學會了基本的操作增刪改的操作倘屹,insert、update慢叨、remove操作纽匙,相對于關系型數據來說語法差不多。