开发者学堂课程【MongoDB精讲课程(上):文档的更新操作】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/726/detail/12957
文档的更新操作
内容介绍:
一,更新文档的语法
二,覆盖的修改
三,局部修改
四,批量的修改
五,列值增长的修改
一,更新文档的语法
db .collection.update(query
,update,options)
/ /或
db.collection.update(
<query> ,
<update>,
{
upsert: <boolean> ,
multi: <boo1ean>,
writeConcern: <document> ,
collation: <document>,
arrayFilters: [ <filter document1>, ... ],
hint: <document |string>
// Available starting in MongoDB 4.2
}
以上为文档更新的语法,语法格式为 db.collection 名称+执行方法(例如本节课执行的就是方法就是更新: update ), update 后面会跟有三个参数:
query:查询条件、update :更新条件、option :附带选项。
二,覆盖的修改
用 db.comment.find 来查询修改之前 comment 表里的数据为:
如果我们想修改 _id 为1的记录,点赞量为1001,输入以下语句:
db.comment. update({_id: "1"},{likenum : NumberInt(1001)})
执行成功后会显示:
WriteResult({
“nMatched” : 1, “nUpserted” : 0, “nModifide” : 1 })
nModifide 说明我们成功修改了一条数据。
执行结果:
我们会发现,这条文档除了 likenum 字段其它字段都不见了,即之前的文档数据被 likenum : NumberInt(1001) 替换掉了。这就叫做覆盖的修改。
三,局部修改
为了解决覆盖修改的问题,我们需要使用修改器 $set 来实现,
命令如下:
如果我们想修改_id 为2的记录,点赞量为1001,输入以下语句:
db.comment.update({_id:"2"},{$set:{likenum :NumberInt(1001)}})
执行结果如下:
这时我们发现我们只更改了点赞量的字段,其他数据没有变化,着就叫做局部修改。
四,批量的修改
如果我们想更新所有用户为1003的用户的昵称为张三。
需要输入指令:
db . comment.update({userid: "1003"},{$set:{nickname: "
张三"}})
这时我们会发现执行后显示:
WriteResult({“nMatched” : 1, “nUpserted” : 0, “nModifide” : 1 })
执行结果:
也就是说刚才的指令默认只修改第一条指令
如果想要两条数据,就需要在刚才执行的指令里加上第三个参数 option,在这里给 multi 配置为 true。
修改后的指令:
db . comment.update({userid: "1003"},{$set:{nickname: "
李四""}},{multi:true})
这里我们把用户名为1003的都修改为李四。
执行后会显示:
WriteResult({
“nMatched” : 2, “nUpserted” : 0, “nModifide” : 2 })
即修改了两条数据。
执行结果:
这就是批量修改。
五,列值增长的修改
如果我们想实现对某列值在原有值的基础上进行增加或减少,可以使用$inc 运算符来实现。
需求:对3号数据的点赞数,每点一次递增1。
输入以下指令:
db.comment.update({_id:"3"},{$inc:{likenum: NumberInt(1)}})
执行结果:
这时我们发现,执行前点赞数为666,执行后为667,这就是列值增长的修改。