前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB使用$set和$inc修改器更新数据

MongoDB使用$set和$inc修改器更新数据

作者头像
飞奔去旅行
发布2019-07-10 15:35:31
1.8K0
发布2019-07-10 15:35:31
举报
文章被收录于专栏:智慧协同

前面我们实验了用update方法来更新一个文档,我们发现,通常一个文档只会有一小部分需要更新,这时候如果我们把新的文档全部写下来做为update方法的第二个参数,显得很啰嗦很麻烦,特别是文档比较复杂的时候.而利用原子的更新修改器,可以使得这种部分的更新极为方便,高效.更新修改器是种特殊的键,用来指定复杂的更新操作,比如调整,增加或者删除键,还可能是操作数组或者内嵌文档.下面,我们来实验下几种常用的更新修改器.首先是

unset.$set用来指定一个键的值.如果这个键存在,就修改它;不存在,就创建它.

代码语言:javascript
复制
> db.name.find(){ 
"_id" : ObjectId("505a5925f67c1b9a341caefb"), 
"fname" : "jeff", 
"lname" : "jiang" }

> db.name.update({"_id" : ObjectId("505a5925f67c1b9a341caefb")},{$set:{"fname" : "jeffery"}})> db.name.find(){ "_id" : ObjectId("505a5925f67c1b9a341caefb"), "fname" : "jeffery", "lname" : "jiang" }可以看到,原文档的"fname"是存在的,所以$set修改器只修改了它的值("jeff"-->"jeffery")> db.name.update({"_id" : ObjectId("505a5925f67c1b9a341caefb")},{$set:{age:23}})> db.name.find(){ "_id" : ObjectId("505a5925f67c1b9a341caefb"), "age" : 23, "fname" : "jeffery", "lname" : "jiang"
 }

而在这里,原文档中是没有"age"这个键的,修改器创建了它.可是,问题来了,它怎么插到了这里,这和我理想中的不一样,我是希望它插入到文档的最后的.是不是因为我用"_id"查找文档,然后它就插入到了"_id"的后面呢.那么,如果我用文档的最后那个键"lname"来查找文档,它是不是会插入到新文档的最后呢?我们实验一下:> db.name.find(){ "_id" : ObjectId("505a5925f67c1b9a341caefb"), "fname" : "jeffery", "lname" : "jiang" }> db.name.update({"lname" : "jiang"},{

set可以修改键的数据类型。例如的的爱好不会只有一种,像我这样没爱好的,也能说出个两三个来。那么,我们可以将上面普通的“favorite”键的值变成一个数组:> db.name.update({"_id" : ObjectId("505a5925f67c1b9a341caefb")},{

set:{favorite:{1:"reading",2:"swimming",3:"surfing the Insternet",4:"listening to music"}}})> db.name.findOne(){ "_id" : ObjectId("505a5925f67c1b9a341caefb"), "age" : 23, "favorite" : { "1" : "reading", "2" : "swimming", "3" : "surfing the Insternet", "4" : "listening to music" }, "fname" : "jeffery", "lname" : "jiang"}现在我们有内嵌文档了,用

set:{"favorite.5":"playing Ping-Pong"}})> db.name.findOne(){ "_id" : ObjectId("505a5925f67c1b9a341caefb"), "age" : 23, "favorite" : { "1" : "reading", "2" : "swimming", "3" : "surfing the Insternet", "4" : "listening to music", "5" : "playing Ping-Pong" }, "fname" : "jeffery", "lname" : "jiang"}可是,我又觉得,打乒乓没有打篮球帅,我想把其中一个爱好改成打篮球,也很简单:> db.name.update({"_id" : ObjectId("505a5925f67c1b9a341caefb")},{

set的基本用法差不多实验完了,下面来看看

unset也可以修改普通文档和内嵌文档。这里我用它来修改内嵌文档。像游泳这种爱好,一年难得一两次的,我想把它从爱好里删除,怎么操作呢?简单看一下:> db.name.update({"_id" : ObjectId("505a5925f67c1b9a341caefb")},{

set修改器可以达到这个目的,但这里我想要用另外一个:

inc:{age:1}})> db.name.findOne(){ "_id" : ObjectId("505a5925f67c1b9a341caefb"), "age" : 24, "favorite" : { "1" : "reading", "3" : "surfing the Insternet", "4" : "listening to music", "5" : "playing basketball" }, "fname" : "jeffery", "lname" : "jiang"}世界那么大,理想那么小,而我那小小的理想目前还不曾实现,这时间又匆匆地过了,压力各种大啊。看,只要那么一下,又过了6年。30可是人生的分水领,不能再这么没出息了,不然一辈子也就这样了:db.name.update({"_id" : ObjectId("505a5925f67c1b9a341caefb")},{

inc:{height:166}})> db.name.findOne(){ "_id" : ObjectId("505a5925f67c1b9a341caefb"), "age" : 30, "favorite" : { "1" : "reading", "3" : "surfing the Insternet", "4" : "listening to music", "5" : "playing basketball" }, "fname" : "jeffery", "height" : 166, "lname" : "jiang"}还好哥才活了23年,到30岁,还能肆无忌惮地奋斗6、7年。希望能混出点名堂。其实我想说的是,

inc:{age:-7}})> db.name.findOne(){ "_id" : ObjectId("505a5925f67c1b9a341caefb"), "age" : 23, "favorite" : { "1" : "reading", "3" : "surfing the Insternet", "4" : "listening to music", "5" : "playing basketball" }, "fname" : "jeffery", "height" : 166, "lname" : "jiang"}总之,你想怎么修改数据,就给

inc只能用于整数、长整数和双精度浮点数。要是其他类型应该使用

set和$inc用来修改标量值。

本文出自 “上下求索者” 博客,请务必保留此出处http://jzfjeff.blog.51cto.com/1478834/999314

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.07.07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档