MongoDB(二)建立更新刪除文檔

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   ar   使用   strong   

插入並儲存文檔操作

用insert向目的地組合插入文檔,如果沒有_id鍵則會自動添加。最後自動儲存。

>db.foo.insert({"bar":"baz"})

如果要批量插入怎麼辦呢,看下面代碼:

>db.foo.insert([{"_id":0},{"_id":1},"{"_id":2}])

以前有一個batchInsert函數,現在已經沒有了。注意在批量插入的過程中如果有一個文檔插入失敗,則這個文檔和他之後的文檔都會插入失敗。如果想要忽略錯誤並且繼續執行就這麼寫:

db.foo.insert([{"_id":3},{"_id":4},{"_id":3},{"_id":5}],continueOnError=true)

在插入資料的時候,mongoDB只會進行簡單的校正:檢查文檔的基本結構,如果沒有_id就自動增加一個。檢查大小,所有的文檔都得<16MB(設計者認為設定的,以後也可能變)。如果想要查看一個文檔的BSON大小,那麼可以這麼做:

Object.bsonsize({"x":1})

這樣就可以獲得文檔的BSON大小。不知道什麼是bson請看這個Bson是什麼

由於MongoDB只進行最基本的檢查,所以插入非法資料非常容易。那麼我們在這個過程中應該只允許信任的源連結的伺服器。

 

刪除文檔

刪除全部文檔命令:

db.foo.remove({})

刪除滿足特定條件的文檔:

db.foo.remove({title:"blog"})

這個會刪除滿足title=blog的文檔,我們也可以只刪除一個滿足條件的文檔:

db.foo.remove({title:"blog"},1)

這個命令會刪除第一個滿足條件的文檔。

在刪除全部文檔的時候,我們用drop()直接刪除集合會更快,但是drop只能全部刪除,並不能指定條件刪除!

 

更新文檔

用update來更新文檔,update有兩個參數,一個是查詢文檔,用於定位需要更新的目的文件;另外一個是修改器,用於說明要對找到的文檔進行哪些修改.更新操作是不可分割的,若兩個更新操作同時發生,那麼先到達伺服器的先執行,再執行另外一個。

1.替換文檔

假設我們之前的文檔是{“_id":0,"name":"faner","friends":88,"enemies":2},現在我們想將friends和enemises兩個欄位移到子文檔relationship中,最簡單的方法就是用一個新文檔來替換我們之前的文檔那麼我們應該這麼做

var faner = db.tester.findOne({name:"faner"});faner.relationship = {"friends":faner.friends,"enemies":faner.enemies};delete faner.friends;delete faner.enemies;db.tester.update({name:"faner"},faner};

這樣我們就完成了我們的替換.但是注意如果查詢條件匹配到了多個文檔,更新時因為第二個參數的原因會導致所有的_id相同,資料庫就會跑出錯誤,任何文檔都不會更新。所以在更新時最好通過唯一索引值來指定唯一文件!
比如說_id,並且用_id查詢比其他欄位快,這是因為索引的關係,我們暫且不談。

 

2.使用修改器

如果文檔只有一部分要更新,那麼我們可以使用原子性(不懂的自己百度吧。畢竟這可是一項基本技能~)的更新修改器,指定對文檔的某些欄位進行更新。

 db.tester.update({name:"faner"},{$set:{x:22}})

這句話的意思是我們找到name=faner的文檔並把他的x變成22,這裡使用了我們的set修改器.$set修改器用來修改一個欄位的值,如果這個欄位不存在則會建立它,除了修改值之外我們還能改變鍵的類型,如下:

db.tester.update({name:"faner"},{$set:{x:[1,2,3,4]}})

這樣我們把我們的x變成了一個數組,相應的我們還能變成內嵌文檔以及其他類型,具體的請自己試試。

如果我們想刪除一個鍵,我們也可以用$unset來完成我們的想法:

db.tester.update({name:"faner"},{$unset:{x:1}})

注意這個欄位x後面的值無意義,什麼都可以,我是習慣寫1而已,每個人根據自己的習慣寫自己的代碼。

除了我們的$set和$unset外,我們還有$inc修改器(自增),$push修改器(向已有的數組末尾加入一個元素)等等.

下面我們通過代碼來看看各個修改器的作用:

 db.tester.update({name:"faner"},{$inc:{x:1}})//inc修改器用來自增
//$push修改器用來在數組後面增加一個元素db.tester.update({name:"faner"},{$push:{x:5}})//push和each結合添加一組元素 db.tester.update({name:"faner"},{$push:{x:{$each:[6,7,8]}}})
//如果希望數組的個數是固定的,則用slice 這裡假設數組長度固定為10個,這裡保留的是最後加進來的10個元素
db.tester.update({name:"faner"},{$push:{x:{$each:[6,7,8],$slice:-10}}})
//如果我想按照某一欄位的大小來保留10個值呢,這裡就要用到我們的$sort
//按照欄位x的遞減順序排序保留10 個
db.tester.update({name:"faner"},{$push:{x:{$each:[6,7,8],$slice:-10,$sort:{"x":-1}}}})
//如果我們不想數數組中的數字有重複的就用$addToSet addToSet也可以和each連用
db.tester.update({name:"faner"},{$addToSet:{x:2}})
//刪除一個數組中的元素就用$pop 和$pull(刪除多個元素)
 db.tester.update({name:"faner"},{$pop:{x:1}}) //從尾部刪除一個元素
 db.tester.update({name:"faner"},{$pop:{x:-1}}) //從頭部刪除一個元素
//對於數組的一部分進行操作用$定位操作符

upsert是一種特殊的更新,要是沒有找到符合更新條件的文檔,則他會自己建立一個新的文檔,找到了就正常更新文檔。使用upsert的方式就是在update的第三個參數寫成true即可,預設為false。

還有$setOnInsert,它只會在第一次修改時設定,以後的更新他就不會改變。sava函數能進行快速修改,如db.tester.save(x)  sava是一個shell函數,如果文檔中含有_id鍵則會調用upsert,否則會調用insert。

 

更新多個文檔

預設情況下,更新只對滿足於匹配條件的第一個文檔進行更新。如果要更新所有匹配文檔,則設定update的第四個參數為true即可.要想知道更新了多少文檔科用命令:db.runCommand({getLastError:1})(返回最後一次操作的相關資訊,n即是被更新文檔的數量)

 

返回被更新的文檔

用findAndModify命令來得到被更新的文檔,findAndModify定義和作用官方文檔

大家自己看官方上的說明,我就不囉嗦了。

MongoDB(二)建立更新刪除文檔

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.