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 :可选,写关注。
发布了111 篇原创文章 · 获赞 0 · 访问量 2072

猜你喜欢

转载自blog.csdn.net/weixin_38932035/article/details/105144279