標籤:
建立、更新和刪除文檔
1. 插入並儲存:
1). 單條插入,insert : db.foo.insert({"bar":"baz"})
2). 批量插入,batchInsert : db.foo.insert([{"_id":0},{"_id":1}])
3). 要是只匯入未經處理資料(例如:從資料feed或者mysql中匯入),可以使用命令列工具,如mongoimport,而不是批量插入。
4). 批量插入中如果遇到錯誤,這個文檔及之後的文檔全部插入失敗。可以使用continueOnError選項,忽略錯誤並且繼續執行後續插入。
5). 目前的版本MongoDB能收的最大訊息長度是48M
6). 插入校正,主要驗證有沒有"_id",是否單條文檔小於16M
2. 刪除文檔
1). 刪除集合中的所有文檔: db.foo.remove()
2). 刪除合格文檔: db.mailing.llist.remove({"out":true})
3). 使用drop直接刪除整個集合會更快: db.foo.drop
3. 更新文檔
1). update更新:update有兩個參數,第一個是查詢文檔,用於定位需要更新目的文件;另一個是修改器文檔,用於說明要對找到的文檔進行哪些修改。
2). 更新多個文檔:預設情況下,更新只對符合匹配條件的第一個文檔執行操作。要是有多個文檔符合條件,只有第一個文檔會被更新。要更新所有匹配的文檔可以將update
第四個參數設定為true。update的預設行為以後可能會發生變化,會預設更新所有合格文檔,只有第四個參數設定為false才會只更新一個,所以建議每次都顯式
表明要不要多文檔更新。
3). 要想知道多文檔更新到底更新了多少文檔,可以運行getLastError命令。
4). 可以通過findAndMofify命令得到被更新的文檔。返回的是修改之前的資料。findAndModify可以使用"update"鍵,也可以使用"remove"鍵。findAndMofify有很多可使用的欄位:
findAndModify : 字串,集合名
query : 檢索文檔的條件
sort : 排序結果條件
udpate : 用於對文檔進行更新
remove : 表示是否刪除文檔,布爾類型
new : 布爾類型,表示返回更新前的文檔還是更新後的文檔。預設是更新前的文檔。
fields : 文檔需要返回的欄位
upert : 布爾類型。值為true表示這是一個upsert。預設為false.
update 和 remove 必須有一個,也只能有一個。要是沒有匹配的文檔,這個命令會返回一個錯誤。
4. 修改器:
1). $set : $set用來指定一個欄位的值。如果這個欄位不存在,則建立它 : db.users.update({"_id":ObjectId("***")},...{"$set":{"name":"lisi"}})
2). $unset : 將某個鍵完全刪除
3). $inc :增加已有的索引值,或者該鍵不存在那就建立一個。"$inc" 只能用於整型、長整型或雙精確度浮點型的值
4). $push : 向已有的資料末尾加一個元素,要是沒有就建立一個。
5). $each : 使用$each子操作符,可以通過一次$push操作添加多個值
6). $slice : 將$slice和$push組合一起使用,這樣就可以保證數組不會超過設定好的最大長度,這實際上就得到一個最多包含N個元素的數組。$slice得值必須是負整數,包含最後加入的N個元素。
7). $sort : 排序。注意,不能只將$slice或者$sort與$push 配合使用,必須和$each一起使用
8). $ne : 不重複
9). $addToSet : 避免往集合中插入的值重複。將$addToSet和$each組合起來,可以添加多個不同的值。與set屬性類似
10). $pop : 從數組中刪除元素。{"$pop":{"key":1}}從數組末尾刪除一個元素,{"$pop":{"key":-1}} 從頭部刪除一個元素
11). $pull : 基於特定條件來刪除元素,而不僅僅一一句元素位置,這時可以使用$pull。$pull 會將所有匹配的元素刪除。
12). 基於位置的資料修改器:通過位置或者定位操作符("$")。定位器只更新第一個匹配的元素。
13). 修改器的速度:$inc能就地修改,因為不需要改變文檔的大小,只需要將鍵的值修改一下,所以非常快。而資料修改器可能會改變文檔的大小,就會慢一些。
14). 填滿因數:填滿因數是MongoDB為每個文檔預留的增長空間。
15). 移動文檔非常慢。MongoDB必須將文檔原先佔用的空間釋放掉,然後將文檔寫入另一片空間。
16). 如果你的模式在進行插入和刪除時會進行大量的移動或者經常打亂資料,可以使用usePowerOf2Sizes選項以提高磁碟複用率。可以通過collMod命令來設定這個選項:
db.runCommond({"collMod":collectionName,"usePowerOf2Sizes":true})
這個集合之後進行所有空間分配時,得到的快大小都是2的冪。這個選項可能會導致初始空間分配不再那麼高效。
17). upsert : 要是沒有找到符合更新條件的文檔,就會以這個條件和更新文檔為基礎建立一個新的文檔。如果找到,正常更新。udpate的第三個參數表示這是個upsert.
db.analytics.update({"url":"/blog"},{"$inc":{"pageviews":1}},true)
這行代碼更高效,並且是原子性的。
18). $setOnInsert : 只會在文檔插入時設定欄位的值。之後的所有更新操作中,這個欄位的值都不會再改變了。
19). save shell 協助程式:save 是一個shell函數,如果文檔不存在,它會自動建立文檔;如果文檔存在,它就更新這個文檔。
5. 寫入安全機制
1). 預設情況下,插入、刪除和更新會一直等待資料庫響應(是否寫入成功) ,然後才會繼續執行。通常,遇到錯誤時,用戶端會拋出一個異常。
2). 應答式寫入是預設的方式:資料庫給出響應,告訴你寫入操作是否成功執行。非應答式寫入不返回任何任何響應,所以無法知道寫入是否成功。
3). shell 在執行非應答式寫入後,會檢查最後一個操作是否成功。可以調用getLastError手動強制在shell中進行檢查,這一操作會檢查最後一次操作中的錯誤。
MongoDB(2)