更新文档
更新文档命令
- db..update()
- db..findAndModify()
- db..save()
db.<collection>.update(<query>, <update>, <options>) 复制代码
- :定义了更新文档操作时筛选文档的条件
- :提供了更新的内容
- :声明的一些更新操作的参数
更新整篇文档
如果中不包含任何更新操作符,那么db..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"}) 复制代码
几个需要注意的事项
- 文档的主键_id是不可以更改的
- 更新整篇文档是可以不用携带主键_id,如果包含主键_id则必须要和被更新的文档的_id保持一致
- 只有第一篇符合筛选条件的文档才会被更新
- 更新整篇文档的操作只能引用在单一文档上
// 更新name为stark的文档的balance字段值为20000, _id字段必须和被更新的文档的_id一致 db.accounts.update({name: "stark"}, {_id: "account1", name: "stark", balance: 30000}) // 再次查看更新后的文档 db.accounts.find({name: "stark"}) 复制代码
文档中包含的_id字段和被更新文档包含的_id字段不一致情况下会报错
只有第一篇符合筛选条件的文档才会被更新
更新文档的特定字段
db.<collection>.update(<query>, <update>, <options>) 复制代码
如果文档中只包含更新操作符,db..update命令将会使用文档更新集合中符合筛选条件的文档中的特定字段
更新操作符
- $set:更新或者新增字段
- $unset:删除字段
$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" }} )