MongoDB中文档的更新操作示例详解

  • A+
所属分类:MongoDB

前言

在MongoDB中,更新单个doc的操作是原子性的。默认环境下,假如一个update操作更新多个doc,那么对每个doc的更新是原子性的,然则对整个update 操作而言,不是原子性的,可能存在前面的doc更新胜利,尔后面的doc更新失败的环境。因为更新单个doc的操作是原子性的,假如两个更新同时产生,那么一个更新操作会壅闭另外一个,doc的终极成果值是由光阴靠后的更新操作决议的。

我们在前面的文章中提到过文档的根本的增编削查操作,MongoDB中提供的增编削查的语法异常丰硕,不清晰的同伙们可以参考这篇文章:http://www.jb51.net/article/87697.htm

那么下面的本文我们主要来看看更新都有哪些好玩的语法。

文档替换

假设我的聚拢中如今存了如下一段数据:

这是一本书,有书名和作者信息,然则作者是一个自力的实体,以是我想将之提掏出来,酿成下面如许:

我可以采纳如下操作:

另外一个问题是更新时,MongoDB只会匹配第一个更新的文档,假设我的MongoDB中有如下数据:

我想把所有x为1的数据改为99,我们很容易想到如下敕令:

但我们发现执行成果倒是如许:

即只有第一条匹配的成果被更新了,其他的都没有变化。这是MongoDB的更新规矩,即只更新第一条匹配成果。假如我们想将所有x为1的更新为x为99,可以采纳如下敕令:

起首我们将要改动的数据赋值给$set,$set是一个改动器,我们将在下文具体讲授,然后后面多了两个参数,第一个false表现假如不存在update记载,是否将我们要更新的文档作为一个新文档插入,true表现插入,false表现不插入,默以为false,第二个true表现是否更新全体查到的文档,false表现只更新第一笔记录,true表现更新所有查到的文档。

使用改动器

许多时刻我们改动文档,只是要改动文章的某一部门,而不是全体,然则如今我面对如许一个问题,假设我有如下一个文档:

我如今想把这个文档中x的值改为99,我可能使用如下操作:

然则更新成果却酿成了如许:

如下图:

MongoDB帮我把整个文档更新了!要办理这个问题,我们可以使用改动器。

$set改动器

$set可以用来改动一个字段的值,假如这个字段不存在,则创立它。如下:

假如该字段不存在,则创立,如下:

也可以应用$unset删除一个字段,如下:

$set也可以用来改动内嵌文档,还以适才的书为例,如下:

想要改动作者的名字,操作如下:

改动成果如下:

$inc改动器

$inc用来增长已有键的值,假如该键不存在就新创立一个。好比我想给上文的罗贯中增长一个年龄为99,方式如下:

执行成果如下:

参加我想给罗贯中增长1岁,执行如下敕令:

这是会在现有值上加1,成果如下:

注意$inc只能用来操作数字,不克不及用来操作null、布尔等。

数组改动器

数组改动器有好几种,我们分离来看。

$push可以向已稀有组末端追加元素,要是不存在就创立一个数组,照样以我们的上面的book为例,假设book有一个字段为comments,是一个数组,表现对这个book的评论,我们可以使用如下敕令添加一条评论:

此时不存在comments字段,体系会主动帮我们创立该字段,成果如下:

此时我们可以追加评论,如下:

成果如下:

假如想一次添加3条评论,可以联合$each一路来使用,如下:

成果如下:

我们可以使用$slice来固定数组的长度,假设我固定数组的长度为5,假如数组中的元素不敷5个,则全体保存,假如数组中的元素跨越5个,则只会保存最新的5个,如下:

注意:$slice的值为负数,运行成果如下:

我们还可以在清算之前使用$sort对数据先进行排序,然后再清算好比我有一个class文档,如下:

如今向这个文档中插入student,每个student有姓名和成就,然后依照成就降序分列,只要前5条数据,如下:

$sort的取值为-1和1,-1表现降序,1表现升序。

上面的敕令执行两次之后(即插入两次),成果如下:

$slice和$sort不克不及只和$push一路使用,还要加上$each。

$addToSet

我们可以在插入的时刻使用$addToSet,表现要插入的值假如存在则不插入,不然插入,如下:

上面的敕令执行多次之后,发现只胜利插入了一条数据。也可以将$addToSet和$each联合起来使用,如下:

$pop

$pop可以用来删除数组中的数据,如下:

1表现从comments数组的末端删除一条数据,-1表现从comments数组的开首删除一条数据。

$pull

使用$pull我们可以按前提删除数组中的某个元素,如下:

表现删除数组中值为444的数据。

$

既然是数组,我们当然可以经由过程下标来拜访,如下一行操作表现将下标为0的(第一个comments)comments改动为999:

可是有的时刻我并不知道我要改动的数据处于数组中的什么地位,这个时刻可以使用$符号来办理:

查询前提查出来333的下标,$符号就代码这个下标,然后经由过程$符号就能将之改动。

save

save是shell中的一个函数,接管一个参数,这个参数便是文档,假如文档中有_id参数save会执行更新操作,不然执行插入操作,使用save操作我们可以便利的完成一些更新操作。

相似于如下敕令则表现一个插入操作(由于没有_id):

好了,MongoDB的更新操作我们就先先容这么多,有问题迎接留言讨论。

参考材料:

1.《MongoDB权势巨子指南第2版》

总结

以上便是这篇文章的全体内容了,愿望本文的内容对年夜家的进修或者事情具有必定的参考进修代价,假如有疑问年夜家可以留言交流,谢谢年夜家对剧本之家的支撑。

您可能感兴致的文章:

MongoDB插入、更新、删除文档实当代码

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: