Mongodb学习日志(二):UPDATE及修改器

学习内容说明:

  1. 更新方法参数使用
  2. 批量更新
  3. 修改器的种类及使用
  4. 批量更新数组(无重复值)

1. 更新方法

mongo通过update方法进行文档修改
db.[文档名称].update( {条件},{修改器 : 更新内容},[true/false], [true/false] )
如:db.person.update( {name : “zhang” }, {$set : {sex : “M”, age : 34}}, true, false)
说明:
1. 修改器是可选的,mongo提供多种修改器,可以选择其中一种或者不选择,如不使用修改器则为强制修改,根据条件查询出的文档将被新文档替换。
2. 第三个参数默认为false,当为true时,其执行方式类似于hibernate的saveOrUpdate,即若有匹配文档时进行更新,若无时则进行插入操作。
3. 第四个参数默认为false,当为true时表示批量修改,为false时只修改匹配的第一条。当批量修改时(参数为true)则需要有一个修改器。

2. 批量更新

设置第三个参数为false,第四个参数为true,并在第二个参数中设置一个修改器。
如:
db.person.update({name : “zhang”},{$set : {sex : “M”}} , false, true)

3. 修改器【通过修改器来完成局部更新操作】

修改器名称语法说明示例
$set{$set:{field:value}}用于指定一个键值对,存在就修改,不存在就添加{$set:{name:”Leon”}}
$inc{$inc:{field:value}}只适用于数字类型的字段值修改,对指定字段进行增减指定数值{$inc:{age:1}}
$unset{$unset:{field:1}}删除指定的字段{$unset:{age:1}}
$push{$push:{field:value}}指定的字段必须是数组,否则中断,指定的字段不存在则创建{$push:{family:”brother”}}
$pushAll{$pushAll:{field:array}}要求同push,一次添加多个元素到数组{$pushAll:{family:[“father”,”mother”,”brother”]}}
$addToSet{$addToSet:{field:value}}将值插入匹配元素指定的数组中,如果该值已存在则不添加{$addToSet:{family:”sister”}
$pop{$pop:{field:value}}从指定字段中数组中删除一个值,value接受正数(最后一个)和负数(第一个),一般使用1和-1{$pop:{family:1}}
$pull$pull:{field:value}从指定字段中的数组中删除指定的一个值{$pull:{family:”father”}}
$pullAll{$pullAll:{field:array}}从指定字段中的数组中删除指定的所有值{$pullAll:{family:[“father”,”mother”]}}
$这是一个定位器非修改器,用于定位数组中的指定键

定位器$的使用:如果数据有多个数值,我们只想对其中一部分进行操作就需要使用到定位器了。
如有如下的文档:

{
  "_id" : ObjectId("566d151734bf4b74caf0d952"),
  "name" : "HuXing",
  "sex" : "F",
  "age" : 12,
  "pid" : "111",
  "family" : [{
      "relation" : "father",
      "name" : "HuChao"
    }, {
      "relation" : "mother",
      "name" : "WangPing"
    }]
}

修改家庭成员中数组中有relation为mother的元素的数组元素为其增加键sex=”F”:

db.person.update({"family.relation":"mother"},$set:"family.$.sex":"F"}})

执行结果:

{
  "_id" : ObjectId("566d151734bf4b74caf0d952"),
  "name" : "HuXing",
  "sex" : "F",
  "age" : 12,
  "sid" : "111",
  "family" : [{
      "relation" : "father",
      "name" : "Hu"
    }, {
      "relation" : "mother",
      "name" : "Ping",
      "sex" : "F"
    }]
}

4. 批量更新数组

我们可以通过pushAll修改器将一个数组A更新到一个字段值为数组的字段中,但是这种操作不会判断原数组中是否已有数组A中的元素,只是简单的全部添加,通过addToSet修改器可以进行逻辑判断,若已存在不添加,但是只能一次一个元素,而不是数组形式,通过将addToSet和each进行结合可以解决这个问题。如下:
原文档

{
  "_id" : ObjectId("566d1e8a34bf4b74caf0d953"),
  "name" : "Leon",
  "sid" : "111",
  "sex" : "M",
  "age" : 18.0,
  "family" : ["father", "mother"]
}

批量更新family增加语句操作:

db.person.update({name:"Leon"},{$addToSet:{family:{$each:["father","sister","brother"]}}})

更新后结果如下,没有重复的father元素:

{
  "_id" : ObjectId("566d1e8a34bf4b74caf0d953"),
  "name" : "Leon",
  "sid" : "111",
  "sex" : "M",
  "age" : 18.0,
  "family" : ["father", "mother", "sister", "brother"]
}

当查询条件或者修改内容的键名中有”.”时键名一定要用双引号(”“)包围

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误通常是由于MongoDB启动失败导致的,具体原因可能有很多,例如: - MongoDB配置文件中的参数设置不正确。 - MongoDB数据目录的权限不正确。 - MongoDB数据目录已经损坏或者磁盘空间不足。 - MongoDB进制文件或者依赖库文件损坏或者不存在。 要解决这个问题,你可以尝试以下几种方法: 1. 检查MongoDB配置文件中的参数设置是否正确。可以查看MongoDB日志文件,例如: ``` tail -f /var/log/mongodb/mongod.log ``` 如果发现日志中有错误信息,可以根据错误信息来修复问题。 2. 检查MongoDB数据目录的权限是否正确。可以使用以下命令来设置MongoDB数据目录的权限: ``` sudo chown -R mongodb:mongodb /var/lib/mongodb sudo chmod -R 755 /var/lib/mongodb ``` 其中"mongodb"是MongoDB服务运行时所使用的用户。 3. 检查MongoDB数据目录是否已经损坏或者磁盘空间不足。可以使用以下命令来检查MongoDB数据目录的磁盘空间: ``` df -h /var/lib/mongodb ``` 如果发现磁盘空间不足,可以尝试清理一些不必要的文件或者扩大磁盘空间。 4. 检查MongoDB进制文件或者依赖库文件是否损坏或者不存在。可以使用以下命令来检查MongoDB进制文件和依赖库文件: ``` md5sum /usr/bin/mongod md5sum /usr/lib64/libbson-1.0.so.0 md5sum /usr/lib64/libmongoc-1.0.so.0 ``` 如果发现文件的md5值不正确,可以重新安装MongoDB或者修复文件。 希望以上方法能够帮助你解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值