插入並保存文檔操做mongodb
用insert向目標集合插入文檔,若是沒有_id鍵則會自動添加。最後自動保存。shell
>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只進行最基本的檢查,因此插入非法數據很是容易。那麼咱們在這個過程當中應該只容許信任的源連接服務器。spa
刪除文檔設計
刪除所有文檔命令:code
db.foo.remove({})
刪除知足特定條件的文檔:htm
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定義和做用官方文檔
你們本身看官方上的說明,我就不囉嗦了。