mongoDB 更新数据

本文深入探讨了MongoDB中更新数据的方法,包括save()和update()函数的使用及区别,展示了如何更新文档、部分字段、数组元素,以及如何利用upsert和multi参数实现文档的插入与批量更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更新数据

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 }

        ]

        }

更多精彩,敬请期待!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值