MongoDB:Update常见错误和update修改器(四)

如果你有过关系型数据库的经验,你会很容易犯只修改需要改变的一项,因为在关系型数据库中就是这样作的。先来准备一些数据,这些数据模拟了一个软件开发小组的组成(当然这不能当真)。

var workmate1={
    name:'HeJian',
    age:18,
    sex:1,
    job:'前端',
    skill:{
        skillOne:'HTML+CSS',
        SkillTwo:'JavaScript',
        SkillThree:'PHP'
    },
    regeditTime:new Date()
}
var workmate2={
    name:'ShengLei',
    age:30,
    sex:1,
    job:'JAVA后端',
    skill:{
        skillOne:'HTML+CSS',
        SkillTwo:'J2EE',
        SkillThree:'PPT'
    },
    regeditTime:new Date()
}
var workmate3={
    name:'MinJie',
    age:20,
    sex:1,
    job:'UI设计',
    skill:{
        skillOne:'PhotoShop',
        SkillTwo:'UI',
        SkillThree:'Word+Excel+PPT'
    },
    regeditTime:new Date()
}
var db=connect('company')
var workmateArray=[workmate1,workmate2,workmate3]
db.workmate.insert(workmateArray)
print('[SUCCESS]: The data was inserted successfully.');

上面的代码,我们以文件的形式向数据库中插入了3条数据。

这时候我突然发现UI职位的性别出现了错误,本来人家是个美女,这里缺写成了男,我们需要修改这条数据,但是经常会这样写。

这样写的问题是,我们的最后一条数据变成了只有sex:0,其它数据全部丢失了,这肯定不是我们想要的。这是新手在操作数据库修改时经常犯的一个错误,就是只修改变动的数据。

正确修改方法:

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

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

这时候你需要删除(db.workmate.drop())表中的数据,因为MinJie这个用户已经不在数据库中了,然后重新使用load方法载入插入数据再进行修改。

//执行命令如下:
db.workmate.drop()
load('./demo02.js')
load('./demo03.js')

现在这种方法才是正确的,数据修改正常了,但是你会发现写起来非常麻烦,而且特别容易写错。接下来我会介绍update修改器,可以很好的解决这个问题。

$set修改器

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

db.workmate.update({"name":"MinJie"},{"$set":{sex:2,age:21}})

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

修改嵌套内容(内嵌文档)

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

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

$unset用于将key删除

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

$inc对数字进行计算

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

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

multi选项

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

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

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

upsert选项

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

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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值