mongo shell 之文件 更新
mongo shell 中更新文件的api 有很多, 可通過 db.[collection].help() 中查詢, 此處筆者只簡單介紹 db.[collection].update( query, object[, upsert_bool, multi_bool] ) 方法,希望能起到拋磚引玉的作用. mongodb shell 中的update 方法使用時需要注意以下兩點:
1. 預設只更新一條記錄,如果想要執行批量更新的操作,需要指定第四個引數為true.
2. 如果不使用更新器的話,會覆蓋式更新整個文件
1. 覆蓋式更新:
1. 命令格式: db.[collection].update({查詢器},{文件} [儲存或更新標誌, 批量更新標誌])
如以下示例,更新之後,文件原有的name, age 屬性全部丟失了,就只剩下了sex 屬性
2. 儲存或更新:
預設情況下,當查詢器匹配的記錄為0條時,不會做任何更新操作.但是當第三個引數設定成true之後,會向集合中插入一條新的文件, 類似於save()操作
3. 批量更新:
mongo shell 中update 方法預設只更新複合查詢條件的第一條記錄,可通過設定第四個引數為true 來實現批量更新
4. 更新器更新:
1. $set: 指定屬性更新值, 如果沒有此屬性,則新增此屬性.
2. $unset: {$unset:{key1:1,key2:1}}, 文件刪除一個key-value,1 沒有任何意義,設定0 也ok
3. $inc: {$inc:{key:num}, 指定整型鍵自增加 num , 原子性操作, 如果不是數值型會報錯
4. $push: ${$push:{arrayKey:value}}針對陣列操作, 陣列新增一個元素
5. $pushAll: ${$pushAll:{arrayKey:[val1,val2...]}}針對陣列操作, 陣列新增多個元素
6. $addToSet: {$addToSet:{arrayKey:value}} 針對陣列操作, 陣列如果不存在此元素新增,否則不新增
7. $pop : {$pop:{key:1}} 從陣列中刪除一個元素, 只能接受1 和 -1, 1 表示刪除末尾元素, -1 表示刪除第一個元素, 相當於棧的pop 操作
8. $pull: {$pull:{key:value}}, 針對陣列型別操作, 從陣列中刪除指定值value的元素,如果存在多個,則一起刪除
9. $pullAll: {$pullAll:{key:[val1,val2...]}}, 針對陣列型別操作, 從陣列中刪除多個元素
10. $each:{$each:[val1,val2...]} 使用each 結合$addToSet 實現 addAllToSet 的功能, mongo shell 並沒有提供此功能, $each 後面只能跟陣列
11. 更新文件物件,使用級聯操作符.
12. $ 陣列定位器, 更新物件陣列中的具體元素,需要注意,查詢器需要是陣列欄位,
這個有點奇葩,有時間再研究了
5. 記憶體簡單分析:
當document 被建立的時候,mongodb為其分配記憶體和預留記憶體,當修改的時候如果不超過預留記憶體的時候,修改速度非常快,如果超過了需要分配新的記憶體,速度就降低了