mongodb 更新操作

  • A+
所属分类:mongodb

这节来说说mongodb更新操作,可以使用update()函数来对数据进行更新。

语法:db.collection.update( criteria, objNew, upsert, multi )

update()接受的四个参数含义如下:

criteria : update的查询条件哪些记录需要更新,类似于SQL update语句的where子句。

objNew : update的对象和一些更新的操作符如$,$inc等等,也可以理解为SQL update语句的set子句。

upsert : 如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。

multi : 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

注意:multi只对$操作有效。

1. 实例1

2. 使用save()命令来完成upset操作

语法:

3. 递增值$inc

$inc允许给一个指定的键加上增量,如果该键不存在将创建。

4. $set设定字段值

可以设定任何数据类型。

5. $unset删除指定字段

6. $push追加一个值到指定字段

$push允许追加一个值到指定字段。如果该字段是一个现有的数组,那么该值将被添加。如果该字段尚不存在,则该字段将被设置为该值的数组。如果该字段存在,但它不是一个数组,将报错。

$push针对数组类型的。

7. 向一个数组添加多个值

$pushAll与$push类似,规则相同。向指定的数组添加多个值。

8.  $addToSet将数据添加到数组

向数组添加数据的另一种方式。然而,该操作只有该数据不存在时添加。同时,只能指定一个参数,如果要指定多个参数可以使用$each.

9. 从数组中删除元素

有多种方式从数组中删除元素: $pop, $pull, $pullAll。

$pop可以删除数组第一个或最后一个元素。1最后一个元素,-1第一个元素。

$pull从数组中删除指定的元素。

$pullAll从数组中删除多个不同的元素。

10. 指定位置来匹配数组

可以使用$操作符在查询中指定的查询匹配的数组项的位置。

11. 原子操作

要么成功要么回滚。

12. 获取最近一次更改信息

13. ABA问题

ABA Problem就是譬如一个共享变量A,需要update到一个新的值C,而记录这个变量的值是B,此时A=B;在记录和update的这段时间中,这个共享变量被其余的job或者是thread操作修改了很多次,但是在update之前,还是回到了最开始的值。这就叫做ABA Problem。

避免方法:

1). 使用整体对象查询表达式代替_id和comments.by。

2). 使用$set来更新。

3). 版本变量控制。

4). 如果可能,使用$来代替update-if-current操作序列。

14. findAndModify()

语法:

原子更新,该命令查询并修改文档。

上面实例更新“Title”并返回旧文档。要返回更改后的文档按下面操作:

weinxin
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~

评论已关闭!

目前评论:2   其中:访客  2   博主  0

    • 汪伽 9

      第12条, db.mediaCollection.update( { “Tracklist.Title” : “In Bloom”},{$inc:{“Tracklist.$.Track” : 1} } )
      Cannot apply $inc modifier to non-number
      > db.$cmd.findOne({getlasterror:1})
      {
      “err” : “Cannot apply $inc modifier to non-number”,
      “code” : 10140,
      “n” : 0,
      “connectionId” : 1,
      “ok” : 1
      }

      这个error是因为什么?一直解决不了,求教

        • 运维生存时间网 7

          @汪伽 “err” : “Cannot apply $inc modifier to non-number”,只有数字才能使用$inc,留一下你的值类型