Not Only SQL (五) - MongoDB Introduce & CRUD (下)

「这是我参与2022首次更文挑战的第31天,活动详情查看:2022首次更文挑战

更新文档

更新文档命令

  • db.<collection>.update()
  • db.<collection>.findAndModify()
  • db.<collection>.save()
db.<collection>.update(<query>, <update>, <options>)
复制代码
  • <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"})
复制代码

image.png 几个需要注意的事项

  • 文档的主键_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"})
复制代码

image.png

<update>文档中包含的_id字段和被更新文档包含的_id字段不一致情况下会报错 image.png

只有第一篇符合筛选条件的文档才会被更新 image.png

更新文档的特定字段

db.<collection>.update(<query>, <update>, <options>)
复制代码

如果<update>文档中只包含更新操作符,db.<collection>.update命令将会使用<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字段 image.png 再次查询name为allen的文档

image.png

扫描二维码关注公众号,回复: 13683117 查看本文章

更新或者新增内嵌文档的字段

// 更新name为allen文档中info字段下的dateOpened字段
db.accounts.update(
	{name: "allen"},
  {$set: {"info.dateOpened": new Date()}}
)
复制代码

image.png 可以通过.调用内嵌的字段

// 更新name为allen文档中contact字段下的数组中的第一个字段的value
db.accounts.update(
	{name: "allen"},
  {$set: {"contact.0": 22222222}}
)
复制代码

更新内嵌数组中的值可以使用 .索引 的方式更新

image.png

往内嵌数组中增加内容

image.png

image.png

如果向现有数组字段范围外的位置增加新值,数组字段的长度会扩大,未被赋值的数组成员将被设置为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": ""
    }}
)
复制代码

image.png

$unset命令中的赋值""对操作结果没有任何影响

// 删除name为allen的文档的balance字段和info字段下的branch字段
db.accounts.update(
    {name: "allen"},
    {$unset: {
        "info.dateOpened": "any value"
    }}
)
复制代码

猜你喜欢

转载自juejin.im/post/7066450632558772237
今日推荐