概述
更新方式
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 :可选,写关注。