1. 程式人生 > >mongo shell 之文件 更新

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為其分配記憶體和預留記憶體,當修改的時候如果不超過預留記憶體的時候,修改速度非常快,如果超過了需要分配新的記憶體,速度就降低了