mongoDB 更新數據

更新數據

MongoDB 使用 update() 和 save() 方法來更新集合中的文檔。

接下來讓我們詳細來看下兩個函數的應用及其區別。

  • save() 方法

save() 方法通過傳入的文檔來替換已有文檔。語法格式如下:

      db.collection.save(
      
       <document>,
       
      {
      
      writeConcern: <document>
      
       }
       
       )

參數說明:

document : 文檔數據。

writeConcern :可選,拋出異常的級別。

  • 實例

以下實例中我們替換了 _id 爲 56064f89ade2f21f36b03136 的文檔數據:


     db.col.save({
     
     "_id" : ObjectId("56064f89ade2f21f36b03136"),
     
     "title" : "MongoDB",
     
     "description" : "MongoDB 是一個 Nosql 數據庫",
     
     "by" : "Runoob",
     
     "url" : "http://www.runoob.com",
     
     "tags" : [
     
            "mongodb",
            
            "NoSQL"
            
       ],
       
      "likes" : 110
      
      })

  • update()方法

     db.collection.update(

     <query>

     <update>

     {

     upsert: <boolean>,
 
     multi: <boolean>,

     writeConcern: <document>,

     }

     )

參數說明:

query : update的查詢條件

update : update的對象和一些更新的操作符(如,,inc…)等

upsert : 可選,這個參數的意思是,如果不存在update的記錄,是否插入objNew,true爲插入,默認是false,不插入

multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,如果這個參數爲true,就把按條件查出來多條記錄全部更新

writeConcern :可選,拋出異常的級別。

實例 例如,給定一個books包含以下文檔的集合:


    {

    _id: 1,

    item: "TBD",

    stock: 0,

    info: { publisher: "1111", pages: 430 },

    tags: [ "technology", "computer" ],

    ratings: [ { by: "ijk", rating: 4 }, { by: "lmn", rating: 5 } ],

    reorder: false

    }

  • 更新部分字段

     db.books.update(

      { _id: 1 },

     {

      $inc: { stock: 5 },  # 自增或者自減,整數爲負值 就是自減

      $set: { # set 是更新部分字段

     item: "ABC123",

     "info.publisher": "2222",

     tags: [ "software" ],

     "ratings.1": { by: "xyz", rating: 3 }

     }

     }

     )

  • 更新結果

      {

      "_id" : 1,

      "item" : "ABC123",

      "stock" : 5,

     "info" : { "publisher" : "2222", "pages" : 430 },

     "tags" : [ "software" ],

     "ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "xyz", "rating" : 3 } ],

     "reorder" : false

     }

更多實例

只更新第一條記錄:

db.col.update( { “count” : { $gt : 1 } } , { $set : { “test2” : “OK”} } );

全部更新:

db.col.update( { “count” : { $gt : 3 } } , { $set : { “test2” : “OK”} },false,true );

只添加第一條:

db.col.update( { “count” : { $gt : 4 } } , { $set : { “test5” : “OK”} },true,false );

全部添加進去:

db.col.update( { “count” : { $gt : 5 } } , { $set : { “test5” : “OK”} },true,true );

全部更新:

db.col.update( { “count” : { $gt : 15 } } , { $inc : { “count” : 1} },false,true );

只更新第一條記錄:

db.col.update( { “count” : { $gt : 10 } } , { $inc : { “count” : 1} },false,false );

  • 更新多個文件需要設置multi爲true

     db.books.update(

     { stock: { $lte: 10 } },

     { $set: { reorder: true } },

     { multi: true }

      )

  • upsertmulti 結合使用

給定下面的文檔


     {

     _id: 5,

     item: "EFG222",

     stock: 18,

     info: { publisher: "0000", pages: 70 },

     reorder: true

     }

     {

     _id: 6,

     item: "EFG222",

     stock: 15,

     info: { publisher: "1111", pages: 72 },

     reorder: true

     }

  • 更新

     db.books.update(

     { item: "EFG222" },

     { $set: { reorder: false, tags: [ "literature", "translated" ] } },

     { upsert: true, multi: true }

     )

  • 更新結果

     {

     "_id" : 5,

     "item" : "EFG222",

     "stock" : 18,

      "info" : { "publisher" : "0000", "pages" : 70 },

      "reorder" : false,

      "tags" : [ "literature", "translated" ]

      }

      {

      "_id" : 6,

     "item" : "EFG222",

     "stock" : 15,

     "info" : { "publisher" : "1111", "pages" : 72 },

     "reorder" : false,

     "tags" : [ "literature", "translated" ]

       }

  • 如果沒有匹配的文檔就會插入文檔

     {

      "_id" : ObjectId("5423200e6694ce357ad2a1ac"),

     "item" : "EFG222",

     "reorder" : false,

     "tags" : [ "literature", "translated" ]

      }

更新數組
實例1

給定以下文檔


      db.students.insert([

      { "_id" : 1, "grades" : [ 95, 92, 90 ] },

      { "_id" : 2, "grades" : [ 98, 100, 102 ] },

      { "_id" : 3, "grades" : [ 95, 110, 100 ] }

      ])

  • 更新語句

     db.students.update(

     { grades: { $gte: 100 } },

     { $set: { "grades.$[element]" : 100 } },

     {

     multi: true,

     arrayFilters: [ { "element": { $gte: 100 } } ]

     }

     )

  • 更新結果

      { "_id" : 1, "grades" : [ 95, 92, 90 ] }

      { "_id" : 2, "grades" : [ 98, 100, 100 ] }

      { "_id" : 3, "grades" : [ 95, 100, 100 ] }
  
實例2

給定以下文檔


      {

      "_id" : 1,

      "grades" : [

      { "grade" : 80, "mean" : 75, "std" : 6 },

      { "grade" : 85, "mean" : 90, "std" : 4 },

      { "grade" : 85, "mean" : 85, "std" : 6 }

      ]

      }

      {

      "_id" : 2,

      "grades" : [

      { "grade" : 90, "mean" : 75, "std" : 6 },

      { "grade" : 87, "mean" : 90, "std" : 3 },

      { "grade" : 85, "mean" : 85, "std" : 4 }

      ]

      }

  • 更新語句

      db.students2.update({ },

       { $set: { "grades.$[elem].mean" : 100 } },

       {

       multi: true,

       arrayFilters: [ { "elem.grade": { $gte: 85 } } ]

        }

        )
  • 更新結果
       {

        "_id" : 1,

        "grades" : [

        { "grade" : 80, "mean" : 75, "std" : 6 },

        { "grade" : 85, "mean" : 100, "std" : 4 },

        { "grade" : 85, "mean" : 100, "std" : 6 }

        ]

        }

        {

        "_id" : 2,

        "grades" : [

        { "grade" : 90, "mean" : 100, "std" : 6 },

        { "grade" : 87, "mean" : 100, "std" : 3 },

        { "grade" : 85, "mean" : 100, "std" : 4 }

        ]

        }

更多精彩,敬請期待!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章