db.<collection>.update(<query>, <update>, <options>)
如果<update>中不包含任何更新操作符,那么db.<collections>.update()命令将会使用<update>中的文档直接替换符合筛选条件的文档
// 查找name为stark的文档
db.accounts.find({name: "stark"})
// 更新name为stark的文档的balance字段值为20000
db.accounts.update({name: "stark"}, {name: "stark", balance: 20000})
// 再次查看更新后的文档
db.accounts.find({name: "stark"})
几个需要注意的事项
// 更新name为stark的文档的balance字段值为20000, _id字段必须和被更新的文档的_id一致
db.accounts.update({name: "stark"}, {_id: "account1", name: "stark", balance: 30000})
// 再次查看更新后的文档
db.accounts.find({name: "stark"})
<update>文档中包含的_id字段和被更新文档包含的_id字段不一致情况下会报错
只有第一篇符合筛选条件的文档才会被更新
db.<collection>.update(<query>, <update>, <options>)
如果<update>文档中只包含更新操作符,db.<collection>.update命令将会使用<update>文档更新集合中符合筛选条件的文档中的特定字段
更新操作符
$set,更新或者新增字段
db.<collection>.update(
{<query>},
{$set: {<field1: value1>, <field2>: <value2>,...}}
)
// 更新name为allen的文档的balance字段并新增info字段
db.accounts.update(
{name: "allen"},
{$set: {
balance: 3000,
info: {
dateOpened: new Date(),
branch: "branch1"
},
}}
)
更新name为allen的文档的balance字段并新增info字段
再次查询name为allen的文档
更新或者新增内嵌文档的字段
// 更新name为allen文档中info字段下的dateOpened字段
db.accounts.update(
{name: "allen"},
{$set: {"info.dateOpened": new Date()}}
)
可以通过.调用内嵌的字段
// 更新name为allen文档中contact字段下的数组中的第一个字段的value
db.accounts.update(
{name: "allen"},
{$set: {"contact.0": 22222222}}
)
更新内嵌数组中的值可以使用 .索引 的方式更新
往内嵌数组中增加内容
如果向现有数组字段范围外的位置增加新值,数组字段的长度会扩大,未被赋值的数组成员将被设置为null
$unset,删除字段
db.<collection>.update(
{<query>},
{$unset: {<field1: value1>, <field2>: <value2>,...}}
)
// 删除name为allen的文档的balance字段和info字段下的branch字段
db.accounts.update(
{name: "allen"},
{$unset: {
balance: "",
"info.branch": ""
}}
)
$unset命令中的赋值""对操作结果没有任何影响
// 删除name为allen的文档的balance字段和info字段下的branch字段
db.accounts.update(
{name: "allen"},
{$unset: {
"info.dateOpened": "any value"
}}
)