mongo更新数据update

使用update修改项时经常会遇到下面坑,先准备些数据。

var workmate1={
    name:'zyb',
    age:23,
    sex:1,
    job:'前端',
    skill:{
        skillOne:'HTML+CSS',
        SkillTwo:'JavaScript',
        SkillThree:'NODE'
    },
    regeditTime:new Date()
}
var workmate2={
    name:'zl',
    age:24,
    sex:1,
    job:'JAVA后端',
    skill:{
        skillOne:'HTML+CSS',
        SkillTwo:'J2EE',
        SkillThree:'MySQL'
    },
    regeditTime:new Date()
}
var workmate3={
    name:'cxw',
    age:20,
    sex:1,
    job:'UI设计',
    skill:{
        skillOne:'PhotoShop',
        SkillTwo:'UI',
        SkillThree:'Word+Excel+PPT'
    },
    regeditTime:new Date()
}
var db=connect('user')
var workmateArray=[workmate1,workmate2,workmate3]
db.workmate.insert(workmateArray)
print('The data was inserted successfully.');

上面的代码,以文件的形式向数据库中插入了3条数据。
这时候突然发现UI职位的性别出现了错误,本来人家是个美女,这里错写成了男,我们需要修改这条数据,如果有过关系型数据库的经验的同学,经常会这样写。

db.workmate.update({name:'cxw'},{sex:0})

这样写的问题是,我们的最后一条数据变成了只有sex:0,其它数据全部丢失了,这肯定不是我们想要的。

【正确的修改方法】
可以声明一个变量,然后把要改变数据的全部信息放入变量,最后执行修改操作。

var db=connect('user')
var workmate3={
    name:'cxw',
    age:20,
    sex:0,
    job:'UI设计',
    skill:{
        skillOne:'PhotoShop',
        SkillTwo:'UI',
        SkillThree:'Word+Excel+PPT'
    },
    regeditTime:new Date()
}
db.workmate.update({name:'cxw'},workmate3)
print('The data was updated successfully');

上面的修改方法每次修改都需要把之前的数据带上,很不优雅简洁。update提供了修改器,帮助我们做这些事情。

【$set修改器】
用来修改一个指定的键值(key),这时候我们要修改上节课的sex和age就非常方便了,只要一句话就可以搞定。

db.workmate.update({"name":"cxw"},{"$set":{sex:0,age:22}})

修改好后,我们可以用db.workmate.find()来进行查看,你会发现数据已经被修改。

修改嵌套内容(内嵌文档)
比如现在的UI的技能发生了变化,说她不会作PPT而是word作的很好,需要进行修改。这时候你会发现skill数据是内嵌的,这时候我们可以属性的形式进行修改,skill.skillThree,具体看下面的代码。

db.workmate.update({"name":"cxw"},{"$set":{"skill.SkillThree":'word'}})

这样就可以简单的修改内嵌文档了。

【$unset用于将key删除】
它的作用其实就是删除一个key值和键。一般女孩子都是不希望看到自己的年龄的,所以要求我们把年龄删除。

db.workmate.update({"name":"cxw"},{$unset:{"age":''}})

当你删除后,想加回来可以直接用$set进行添加。

【$inc对数字进行计算】
这是对value值的修改,但是修改的必须是数字,字符串是不起效果的。我们现在要对zl的年龄减去2岁,就可以直接用$inc来操作。

db.workmate.update({"name":"zl"},{$inc:{"age":-2}})

【multi选项】
现在领导说了,你要把每个人的爱好也加入进来,但是如果你直接写会只加一个,比如下面这种形式。

db.workmate.update({},{$set:{interset:[]}})

这时候你用db.workmate.find()查找,你会发现只改变了第一个数据,其他两条没有改变。这时候我们想改变就要用到multi选项。

db.workmate.update({},{$set:{interset:[]}},{multi:true})

这时候每个数据都发生了改变,multi是有ture和false两个值,true代表全部修改,false代表只修改一个(默认值)。

【upsert选项】
upsert是在找不到值的情况下,直接插入这条数据。比如我们这时候又来了一个新同事xw,我们这时候修改他的信息,age设置成20岁,但集合中并没有这条数据。这时候可以使用upsert选项直接添加。

db.workmate.update({name:'xw'},{$set:{age:20}},{upsert:true})

upsert也有两个值:true代表没有就添加,false代表没有不添加(默认值)。

上面是一些基础的修改器,接下来主要是数组修改器的操作,当然也可以修改内嵌文档,也就是对象形式的数据。

【$push追加数组/内嵌文档值】
$push的功能是追加数组中的值,但我们也经常用它操作内嵌文档,就是{}对象型的值。先看一个追加数组值的方式,比如我们要给小王加上一个爱好(interset)为画画(draw):

db.workmate.update({name:'xw'},{$push:{interest:'draw'}})

当然$push修饰符还可以为内嵌文档增加值,比如我们现在要给我们的UI,增加一项新的技能skillFour为draw,这时候我们可以操作为:

db.workmate.update({name:'cxw'},{$push:{"skill.skillFour":'draw'}})

$push修饰符在工作中是最常用的,因为我们的数据一般都会涉及数组和内嵌文档的操作。

【$ne查找是否存在】
它的作用是,检查一个值是否存在,如果不存在再执行操作,存在就不执行。
如果xiaoWang的爱好(interest)里没有palyGame这个值,我们就加入Game这个爱好。

db.workmate.update({name:'xw',"interest":{$ne:'playGame'}},{$push:{interest:'Game'}})

【$addToSet 升级版的$ne】
它是$ne的升级版本(查找是否存在,不存在就push上去),操作起来更直观和方便,所以再工作中这个要比$en用的多。
我们现在要查看小王(xiaoWang)兴趣(interest)中有没有阅读(readBook)这项,没有则加入读书(readBook)的兴趣.

db.workmate.update({name:"xiaoWang"},{$addToSet:{interest:"readBook"}})

【$each 批量追加】
它可以传入一个数组,一次增加多个值进去,相当于批量操作,性能同样比循环操作要好很多,这个是需要我们注意的,工作中也要先组合成数组,然后用批量的形式进行操作。
我们现在要给xw,一次加入三个爱好,唱歌(Sing),跳舞(Dance),编码(Code)。

var newInterset=["Sing","Dance","Code"];
db.workmate.update({name:"xw"},{$addToSet:{interest:{$each:newInterset}}})

【$pop 删除数组值】
$pop只删除一次,并不是删除所有数组中的值。而且它有两个选项,一个是1和-1。
1:从数组末端进行删除
-1:从数组开端进行删除
例子:现在要删除xiaoWang的编码爱好(code)。

db.workmate.update({name:'xw'},{$pop:{interest:1}})

【数组定位修改】
有时候只知道修改数组的第几位,但并不知道是什么,这时候我们可以使用interest.int 的形式。
例子,比如我们现在要修改xiaoWang的第三个兴趣为编码(Code),注意这里的计数是从0开始的。

db.workmate.update({name:'xw'},{$set:{"interest.2":"Code"}})

你可能感兴趣的:(mongo更新数据update)