插入并保存文檔
插入數據可以使用insert方法向目標集合插入一個文檔。
db.foo.insert({"bar" : "baz"})
批量插入
批量插入使用batchInsert函數實現批量插入,它與insert函數非常像,只是它接受的是一個文檔數組作為參數。
db.foo.batchInsert([{"_id" : 0}, {"_id" : 1}, {"_id" : 2}])
插入校驗
插入數據時,MongoDB只對數據進行基本的檢查:
如果沒有"_id"字段,就自動增加一個;
所有文檔都必須小于16M。
刪除文檔
db.foo.remove()
更新文檔
使用update來更新數據庫中的文檔。
“$set”修改器
“$set”用來指定一個字段的值,如果這個字段不存在,則可以創建它。
使用“$unset”則可以直接刪除這個字段和相應的值。
刪除數據是永久性的,不能撤銷,也不能恢復。 刪除文檔通常很快,但是如果要清空整個集合,那么使用drop直接刪除集合會更快(然后在這個空集合上重建各項索引)。
增加和修改
“$inc”修改器用來增加已有的鍵的值,或者該鍵不存在那就創建一個。對于更新分析數據,因果關系,投票或者其他由變化數值的地方,只用這個都會非常的方便。
"$inc"和“$set”的用法類似,就是專門來增加(和減少)數字的。“$inc”只能用于整形,長整形或雙精度浮點型的值。要是用在其他類型的數據上就會導致操作失敗,例如null,布爾型以及數字構成的字符串。
添加元素
“$push”會向已有的數組末尾加入一個元素,要是沒有就創建一個新的數組。
將數組做俄日數據集來使用
你可能想將數組作為數據集使用,保證數組中的元素不會重復??梢栽诓樵兾臋n中用“$ne”來實現。
刪除元素
有幾個從數組中刪除元素的方法。若是把數組看成是隊列或者棧,可以用“$pop”,這個修改器可以從數組的任何一端刪除元素。{"$pop":{"key":1}} 從數組末尾刪除一個元素, {"$pop":{"key":-1}} 則從頭部刪除。
“$pull”會將所有匹配的文檔刪除,而不是只刪除一個。
修改器的速度
有的修改器運行速度比較塊。$inc能就地修改,因為不需要改編文檔的大小,只需要將鍵的值修改一下(對文檔的大小的改變),所以非常的塊。而數組修改器可能會改變文檔的大小,就會慢一些。
將文檔插入到MongoDB中時,依次插入的文檔在磁盤上的位置是相鄰的。因此如果一個文檔變大了,原先的位置就放不了這個文檔,這個文檔就會被移動到集合中的另一個位置。
upsert
upsert是一種特殊的更新。要是沒有找到符合條件的更新的文檔,就會以這個條件和更新文檔為基礎創建一個新的文檔。upsert非常方便,不必預置集合,同一套代碼既可以用于創建新的文檔又可以用于更新文檔。
更新多個文檔
默認情況下,更新只能對符合匹配條件的第一個文檔進行操作。要是有多個文檔符合條件,只有第一個文檔會被更新,其他文檔不會發生變化。要更新所有匹配的文檔,可以將update的第4個參數設置為true。
返回被更新的文檔
調用getLastError僅能夠獲得關于更新的有限信息,并不能返回被更新的文檔??梢酝ㄟ^findAndModify命令得到被更新的文檔。這對于操作隊列以及執行其他需要進行原子性取值和賦值。
findAndModify命令有很多可以使用的字段:
findAndModify 字符串,集合名
query 查詢文檔,用于檢索文檔的條件
sort 排序結果的條件
update 修改器文檔,用于對匹配的文檔進行更新
remove 布爾類型,表示是否刪除文檔
new 布爾類型,表示返回更新前的文檔還是更新后的文檔
fields 文檔中需要返回的字段(可選)
upsert 布爾類型,值為true時表示這是一個upsert,默認值是false
寫入安全機制
寫入安全(Write Concern)是一種客戶端設置,用于控制寫入的安全級別。默認情況下,插入,刪除和更新都會是一直等待數據庫的響應,然后才會繼續執行。通常遇到錯誤時,客戶端會拋出一個異常。
兩種最基本的寫入安全機制是應答寫入和非應答寫入。應答寫入是默認的方式:數據庫會給出響應,告訴你寫入操作是否成功執行。非應答式寫入不返回任何響應。+
通常來說,應用程序應該使用應答式寫入。但是,對于一些不是特別重要的數據(比如日志或者是批量加載數據),你可能不愿意為了自己不關心的數據而等待數據庫的響應。這種情況下,可以使用非應答式寫入。
盡管非應答式寫入不返回數據庫錯誤,但是這并不代表應用程序不需要作錯誤檢查。如果嘗試向已經關閉的套接字(socket)執行寫入,或者寫入套接字時發生了錯誤,都會引起異常。