MongoDB更新

概述

更新方式

db.collection.updateOne(< filter>, < update>, < options>)
db.collection.updateMany(< filter>, < update>, < options>)
db.collection.replaceOne(< filter>, < update>, < options>)
db.collection.update(< filter>, < update>, < options>)

数据准备

db.inventory.insertMany( [
   { item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
   { item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
   { item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
] );

一、updateOne

db.collection.updateOne(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string>        // Available starting in MongoDB 4.2.1
   }
)

参数说明:

  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如 $, $inc…)等,也可以理解为sql update查询内set后面的
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • writeConcern :可选,写关注。
  • collation:指定用于操作的排序规则。归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。
  • arrayFilters:筛选器文档数组,用于确定要为数组字段上的更新操作修改哪些数组元素。
  • hint:可选的。 一个文档或字符串,它指定用于支持查询的索引;
    该选项可以采用索引规范文档或索引名称字符串;
    如果指定的索引不存在,则操作错误。

下面的示例在清单集合上使用db.collection.updateOne()方法更新item字段等于“paper”的第一个文档:

db.inventory.updateOne(
   { item: "paper" },
   {
     $set: { "size.uom": "cm", status: "P" },
     $currentDate: { lastModified: true }
   }
)

更新操作:

  • 使用$ set运算符将size.uom字段的值更新为“ cm”,将status字段的值更新为“ P”,
  • 使用$ currentDate运算符将lastModified字段的值更新为当前日期。 如果lastModified字段不存在,则$ currentDate将创建该字段:
    “lastModified” : ISODate(“2020-03-27T08:29:57.661Z”)
    有关详细信息,请参见$ currentDate。

二、updateMany

以下示例在清单集合上使用db.collection.updateMany()方法来更新数量小于50的所有文档:

db.inventory.updateMany(
   { "qty": { $lt: 50 } },
   {
     $set: { "size.uom": "in", status: "P" },
     $currentDate: { lastModified: true }
   }
)

更新操作:
使用$ set运算符将size.uom字段的值更新为“ in”,将status字段的值更新为“ P”,
使用$ currentDate运算符将lastModified字段的值更新为当前日期。 如果lastModified字段不存在,则$ currentDate将创建该字段。
有关详细信息,请参见$ currentDate。

三、replaceOne 替换文档

要替换_id字段以外的文档的全部内容,请将一个全新的文档作为第二个参数传递给db.collection.replaceOne()。

替换文档时,替换文档必须仅由字段/值对组成; 即不包含更新运算符表达式。

替换文档可以具有与原始文档不同的字段。 在替换文档中,由于_id字段是不可变的,因此可以省略_id字段。 但是,如果您确实包含_id字段,则它必须与当前值具有相同的值。

以下示例替换了集合中项目item: "paper"第一个文档:

db.inventory.replaceOne(
   { item: "paper" },
   { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)

替换完变成
{
        "_id" : ObjectId("5e7dacb64b82ef4149831c19"),
        "item" : "paper",
        "instock" : [
                {
                        "warehouse" : "A",
                        "qty" : 60
                },
                {
                        "warehouse" : "B",
                        "qty" : 40
                }
        ]
}

四、update() 方法

db.collection.update(    
	<query>, 
	<update>, 
	{       
		upsert: <boolean>,   
		multi: <boolean>,  
		writeConcern: <document>
	}
)
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );

参数说明:

  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如 $, $inc…)等,也可以理解为sql update查询内set后面的
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,写关注。

接着我们通过 update() 方法来更新标题(title):

>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })     

以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true

>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})

五、save() 方法

ave() 方法通过传入的文档来替换已有文档。语法格式如下:

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

参数说明:

  • document : 文档数据。
  • writeConcern :可选,写关注。
MongoDB中,有几个常用的更新方法,包括save()、update()和findAndModify() 。其中,save()方法用于更新或保存数据,它会根据已有的数据来决定是更新还是新增数据。update()方法用于更新指定条件下的数据,可以通过设置更新操作符来单独更新部分数据。findAndModify()方法用于查找并修改指定条件下的数据,可以同时进行查找和更新操作。 在进行数据更新时,可以使用update()方法,并指定筛选条件来确定要更新的数据范围 。在update()方法中,可以使用更新操作符来指定需要更新的字段和对应的值。如果不希望覆盖原有数据而只是更新部分数据,可以使用更新操作符来实现。例如,可以使用以下方式来更新名为"ww"的人的年龄为90: db.person.update({name: 'ww'}, {age: 90}, {}) 这个更新操作会将名为"ww"的人的年龄字段更新为90,而其他字段则保持不变 。使用update()方法可以根据指定条件来更新数据,使得数据保持最新和准确。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [mongodb更新操作](https://blog.csdn.net/ice_stone_kai/article/details/123216202)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [MongoDB数据更新方法干货篇](https://download.csdn.net/download/weixin_38501363/13697496)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值