数据库的更新操作

1,update() 方法

update() 方法用于更新已存在的文档

语法:

db.collection.update(
   <query>,//查询条件
   <update>,//更新操作
   {
     upsert: <boolean>,//可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
     multi: <boolean>,//可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
     writeConcern: <document>//抛出异常的级别。
   }
)

例子:

>db.stus.update({name:'玉皇大帝'},{$set:{address:"南天门"}},{multi:true})
//$set是指定字段设置,如果没有,则会修改正整条数据
'DeprecationWarning: Collection.update() is deprecated. Use updateOne, updateMany or bulkWrite.'
//该方法已经过时
{ acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0 }

结果:

{"_id":{"$oid":"609f911d6f765a36017e2a36"},"name":"玉皇大帝","gender":"male","age":888,"address":"南天门"}

2,save() 方法

save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入。

语法:

db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)

例子:

>db.stus.save({
	"_id" : ObjectId("123"),"name":"蜘蛛精","gender":"female","age":18,"address":"盘丝洞"
})
MongoshInvalidInputError: Collection.save() is deprecated. Use insertOne, insertMany, updateOne or updateMany.
//过时,直接报错,更新失败

3,updateOne()

updateOne() 向指定集合更新单个文档

语法:

db.collection.update(
   <query>,//查询条件
   <update>,//更新操作
)

例子:

>db.stus.updateOne({
	name:'孙悟空'
},
{
	$set:{name:'齐天大圣'}
})
{ acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0 }

结果:

{"_id":{"$oid":"609f906d6f765a36017e2a33"},"name":"齐天大圣","gender":"male","age":55,"address":"花果山"}

3,db.collection.updateMany()

updateMany() 向指定集合更新多个文档

语法:

db.stus.updateMany({条件},{修改})

例子:

>db.stus.updateMany({age:{$gt:45}},{$set:{age:66}})//$gt : 大于
{ acknowledged: true,
  insertedId: null,
  matchedCount: 3,
  modifiedCount: 3,
  upsertedCount: 0 }

结果:

>db.stus.find({age:{$gt:45}})
{ _id: ObjectId("609f906d6f765a36017e2a33"),
  name: '齐天大圣',
  gender: 'male',
  age: 66,
  address: '花果山' }
{ _id: ObjectId("609f911d6f765a36017e2a36"),
  name: '玉皇大帝',
  gender: 'male',
  age: 66,
  address: '南天门' }
{ _id: ObjectId("609f96456f765a36017e2a3b"),
  name: '牛魔王',
  gender: 'male',
  age: 66,
  address: '火焰山' }

4,移除集合中的键值对,使用的 $unset 操作符:

语法:

db.stus.update({条件},{ $unset: { <field1>: "", ... } })

例子:

>db.stus.updateOne({name:'玉皇大帝'},{$unset:{age:11}})
{ acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0 }

结果:

{"_id":{"$oid":"609f911d6f765a36017e2a36"},"name":"玉皇大帝","gender":"male","address":"南天门"}

补充:

WriteConcern异常类型
WriteConcern.NONE:没有异常抛出
WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常
WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。
WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。
WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
WriteConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。