将文档存入数据库之后,可以使用以下几种更新方法之一对其进行更改,updateOne,updateMany和replaceOne.
updateOne和updateMany都将筛选文档作为第一个参数,将变更文档作为第二个参数,后者对要进行的更改进行描述。replaceOne同样将筛选文档作为第一个参数,但第二个参数是用一个用来替换所匹配的筛选文档的新文档。
更新文档是属于原子性操作:如果两个更新同时发生,那么首先到达服务器得的更新会先被执行,然后再执行下一个更新。因此,相互冲突的更新可以安全地迅速连接完成,而不会破坏任何文档,最后一次更新将”成功“。如果不想使用默认行为,则可以考虑使用文档版本控制模式.
> db.four.find(); { "_id" : 1, "name" : "ll", "age" : 20 }
使用修饰符"$set"
> db.four.updateOne({"_id":1},{"$set":{"age":22}}) { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
更新后的数据
> db.four.find(); { "_id" : 1, "name" : "ll", "age" : 22 }
"$set"用来设置一个字段的值。如果这个字段不不存在,则创建该字段。这对于更新模式或添加用户定义的键来说非常方便。
- Update操作执行格式:db.<集合>.update(<查询条件>,<更新字段>)
- 以下面的数据为例
> db.fruit.insertMany([{name:"apple"},{name:"pear"},{name:"orange"}]) { "acknowledged" : true, "insertedIds" : [ ObjectId("625a67daa1fbd7dca4520184"), ObjectId("625a67daa1fbd7dca4520185"), ObjectId("625a67daa1fbd7dca4520186") ] } > > > db.fruit.find(); { "_id" : ObjectId("625a67daa1fbd7dca4520184"), "name" : "apple" } { "_id" : ObjectId("625a67daa1fbd7dca4520185"), "name" : "pear" } { "_id" : ObjectId("625a67daa1fbd7dca4520186"), "name" : "orange" } >
> db.fruit.updateOne({"name":"apple"},{$set:{from:"China"}}) ##如果这里没有from字段的话,会直接进行添加。。。 { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 } > > db.fruit.find(); { "_id" : ObjectId("625a67daa1fbd7dca4520184"), "name" : "apple", "from" : "China" } { "_id" : ObjectId("625a67daa1fbd7dca4520185"), "name" : "pear" } { "_id" : ObjectId("625a67daa1fbd7dca4520186"), "name" : "orange" } >
- 使用updateOne表示无论条件匹配多少条记录,始终只更新第一条
- 使用updateMany表示条件匹配多少条就更新多少条
- updateOne/updateMany方法要求更新条件部分必须具有以下之一,否则将报错:
- $set/$unset
- $push/$pushAll/$pop
- $pull/$pullAll
- $addToset
1.$push:增加一个对象到数组底部
2.$pushAll:增加多个对象到数组底部
3.$pop:从数组底部删除一个对象
4.$pull:如果匹配指定哦值,从数组中删除相应的对象
5.$pullAll:如果匹配任意的值,从数据中删除相应的对象
6.$addToset:如果不存在则增加一个值到数组。
这里示范更新一个子文档
> db.fruit.find() //原始的模样,这里要求把count字段的值有china更新为American { "_id" : ObjectId("625a67daa1fbd7dca4520184"), "name" : "apple", "from" : "China" } { "_id" : ObjectId("625a67daa1fbd7dca4520185"), "name" : "pear" } { "_id" : ObjectId("625a67daa1fbd7dca4520186"), "name" : "orange" } { "_id" : ObjectId("625a7016a1fbd7dca4520187"), "name" : "apple", "from" : { "count" : "china", "province" : "Guangdong" } } >
更新操作:注意前面的是一个过滤条件,取具体的_id的那一列。。。然后后面的就是开始更新,注意from.count的写法(这个很重要)
> db.fruit.updateOne({"_id":ObjectId("625a7016a1fbd7dca4520187")},{$set:{"from.count":"Ame"}}) //更新 { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 } >
这里还有一个需求是:我想把count字段修改为country字段
> db.fruit.updateOne({"_id":ObjectId("625a7016a1fbd7dca4520187")},{"$rename":{"from.count":"from.country"}},false,true) //这里使用关键词rename { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 } > db.fruit.find(); { "_id" : ObjectId("625a67daa1fbd7dca4520184"), "name" : "apple", "from" : "China" } { "_id" : ObjectId("625a67daa1fbd7dca4520185"), "name" : "pear" } { "_id" : ObjectId("625a67daa1fbd7dca4520186"), "name" : "orange" } { "_id" : ObjectId("625a7016a1fbd7dca4520187"), "name" : "apple", "from" : { "province" : "Guangdong", "country" : "Ame" } } >