wns9778.com_威尼斯wns.9778官网

热门关键词: wns9778.com,威尼斯wns.9778官网
wns9778.com > 计算机教程 > MongoDB中文档的更新操作示例详解

原标题:MongoDB中文档的更新操作示例详解

浏览次数:139 时间:2019-06-01

db.sang_collect.update({name:"三国演义"},{$addToSet:{comments:{$each:["111","222","333"]}}})

在MongoDB中,如果要修改doc中的数组,可以使用 dot notation,使用 arrary.index.field 对数组中特定位置的元素进行修改。

1表示从comments数组的末尾删除一条数据,-1表示从comments数组的开头删除一条数据。

{_id:1,
   qty: [
          { size: "S", num: 10, color: "yellow" },
          { size: "M", num: 45, color: "blue" },
          { size: "L", num: 100, color: "green" }
        ]
}
{_id:2,
   qty: [
          { size: "S", num: 10, color: "blue" },
          { size: "M", num: 100, color: "red" },
          { size: "L", num: 100, color: "green" }
        ]
}

图片 1

$addToSet 能够一次性向数组中插入多个元素。

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

二,修改字段的值

假设我的集合中现在存了如下一段数据:

示例,第一次调用$push,由于doc中不存在comments字段,因此MongoDB向doc中新建comments 数组字段,并初始化数组

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

通过$push 插入元素,有可能插入重复的元素,MongoDB允许数组中的元素重复;如果一个数组不能插入重复值,可以使用$addToSet修改器, $addToSet在向数组插入元素时,首先检查元素是否已经存在于数组中,如果不存在,那么$addToSet将元素插入到数组中;如果存在,那么$addToSet不会插入任何元素。$addToSet只会保证不会插入重复的元素,不应影响数组中已经存在的重复元素。

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

8,根据queyr filter删除数组元素

{
 "_id" : ObjectId("59f07f3649fc5c9c2412a662"),
 "class" : "三年级二班"
}

$size操作符,如果doc中存在数组,并且数组的元素满足$size指定的条件,那么返回该doc。

save

图示,$slice:-5,MongoDB先将新的元素插入到数组中,将保留数组末尾的5个元素,将数组的其他元素删除

图片 2

4,限制数组中元素的数量

{
 "_id" : ObjectId("59f042cfcafd355da9486008"),
 "name" : "三国演义",
 "author" : {
 "name" : "明代罗贯中",
 "gender" : "男",
 "age" : 100.0
 },
 "comments" : [ 
 "好书666", 
 "好书666啦啦啦啦", 
 "111", 
 "222", 
 "333"
 ]
}

MongoDB uses the dot notation to access the elements of an array and to access the fields of an embedded document.

db.sang_collect.update({comments:"333"},{$set:{"comments.$":"333-1"}})

示例1,使用empty filter作为query filter

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

db.users.updateMany(
{},
{$push:
   {comments:
      {
        $each:[ {msg:"c7"}, {msg:"c8"}, {msg:"c9"}],
        $slice:-5
      }
   }
}
)

参考资料:

$addToSet only ensures that there are no duplicate items added to the set and does not affect existing duplicate elements. $addToSet does not guarantee a particular ordering of elements in the modified set.

您可能感兴趣的文章:

只要数组中有一个元素的值是90,就满足query filter,因此,这3个数组都满足条件。

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

参考doc:

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

使用$push 修改器只能将元素插入到数组字段的尾部,搭配使用$position 修改器,能够指定元素插入的开始位置,$position 必须和$each搭配使用。数组的下标是从0开始的。

db.sang_collect.update({name:"三国演义"},{$pop:{comments:1}})

示例3,包含关系(数组元素是doc)

{ "_id" : ObjectId("59f00d4a2844ff254a1b68f7"), "x" : 1 }
{ "_id" : ObjectId("59f00d4a2844ff254a1b68f8"), "x" : 1 }
{ "_id" : ObjectId("59f00d4a2844ff254a1b68f9"), "x" : 1 }
{ "_id" : ObjectId("59f00d4a2844ff254a1b68fa"), "x" : 2 }

$: Acts as a placeholder to update the first element that matches the query condition in an update.

图片 3

图示,使用$position 指定元素插入的开始位置,将c5,c6 依次插入都数组的2,3位置处,由于数组的小标是从0开始的,c5,c6 是数组的第3,4个元素图片 4

$inc修改器

MongoDB使用 dot 访问数组的元素,或内嵌doc字段。

但是更新结果却变成了这样:

示例,后续再次调用$push,向已有的数组字段的尾部追加一个元素

db.sang_collect.update({x:1},{$set:{x:99}},false,true)
users=
{
name:"t1",
age:21,
address: {phone:123,email:"xxx@163.com"},
followers:[{name:"a"},{name:"b"},{name:"c"}]
}

加入我想给罗贯中增加1岁,执行如下命令:

db.users.updateMany(
{},
{$pull:{comments:{msg:"c7"}}}
)

$slice和$sort不能只和$push一起使用,还要加上$each。

2,数组的比较,使用数组进行条件匹配

我们在前面的文章中提到过文档的基本的增删改查操作,MongoDB中提供的增删改查的语法非常丰富,不清楚的朋友们可以参考这篇文章://www.jb51.net/article/87697.htm

followers 字段是数组,查询followers中存在name=“b”的doc

图片 5

{ "_id" : 3, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "xyz", "score" : 8 } ] }
db.sang_collect.update({x:1},{x:99})

图片 6

$pop

$all 表示集合的包含关系,全集包含子集的所有元素。如果数组A包含数组B,那么A是B的全集,B是A的子集。子集中的所有元素,都存在于全集;全集中的元素,不一定存在于子集。

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

示例1,对于query filter:{grades:{$gt:85, $lt:100}},分析这3个数组是否满足:

$addToSet

user1={ name:"t1", age:21}
user2={ name:"t2", age:22}
user3={ name:"t3", age:23}

db.users.insert([user1,user2,user3])
db.sang_collect.update({name:"三国演义"},{$addToSet:{comments:"好书"}})

3,查询数组元素的数量

{
 "_id" : ObjectId("59f042cfcafd355da9486008"),
 "name" : "三国演义",
 "author" : {
 "name" : "明代罗贯中",
 "gender" : "男",
 "age" : 100.0
 },
 "comments" : [ 
 "好书666", 
 "好书666啦啦啦啦"
 ]
}
db.users.updateMany
(
{},
{$push:
    {comments:
        {
           $each:[ { msg:"c5"}, {msg:"c6"} ],
           $position:2
        }
    }
}
)

查询条件查出来333的下标,$符号就代码这个下标,然后通过$符号就能将之修改。

db.users.updateMany(
{},
{$push:{comments:{msg:"c2"}}}
)
{
 "_id" : ObjectId("59f07f3649fc5c9c2412a662"),
 "class" : "三年级二班",
 "students" : [ 
 {
  "name" : "张一百",
  "score" : 100.0
 }, 
 {
  "name" : "张一百",
  "score" : 100.0
 }, 
 {
  "name" : "张九九",
  "score" : 99.0
 }, 
 {
  "name" : "张九九",
  "score" : 99.0
 }, 
 {
  "name" : "张九八",
  "score" : 98.0
 }
 ]
}
 db.foo.find({"qty.color":{$all:["blue","green"]}})

这是一本书,有书名和作者信息,但是作者是一个独立的实体,所以我想将之提取出来,变成下面这样:

三,修改数组

可是有的时候我并不知道我要修改的数据处于数组中的什么位置,这个时候可以使用$符号来解决:

{ "_id" : 1, "grades" : [ 80, 85, 90 ] }
{ "_id" : 2, "grades" : [ 88, 90, 92 ] }
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
{
 "_id" : ObjectId("59f042cfcafd355da9486008"),
 "name" : "三国演义",
 "author" : {
 "name" : "罗贯中",
 "gender" : "男"
 }
}
db.users.updateMany(
{},
{$set:
   {
    followers:[ {name:"t5"},{name:"t7"} ]
   }
}
)
{ "_id" : ObjectId("59f00d4a2844ff254a1b68f7"), "x" : 99 }
{ "_id" : ObjectId("59f00d4a2844ff254a1b68f8"), "x" : 1 }
{ "_id" : ObjectId("59f00d4a2844ff254a1b68f9"), "x" : 1 }
{ "_id" : ObjectId("59f00d4a2844ff254a1b68fa"), "x" : 2 }

图片 7

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

2,向数组字段插入多个元素

{
 "_id" : ObjectId("59f042cfcafd355da9486008"),
 "name" : "三国演义",
 "author" : {
 "name" : "明代罗贯中",
 "gender" : "男"
 }
}

The $all operator selects the documents where the value of a field is an array that contains all the specified elements.

结果如下:

图片 8

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

{ array : { $all: [ <value1> , <value2> ... ] } }

我们可以使用$slice来固定数组的长度,假设我固定数组的长度为5,如果数组中的元素不足5个,则全部保留,如果数组中的元素超过5个,则只会保留最新的5个,如下:

1,使用$push向doc中增加数组,或插入新的元素

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

9,根据数组的下标修改元素,数组下标是从0开始的

{x:1,y:2,z:3}

图示,$each 向现有的数组的尾部中插入三个元素:c7,c8,c9,$sort:{msg:-1} 对数组按照msg的降序排序,$slice:-5 操作符限制数组的元素数量,只保留数组尾部的5个元素。

$set修改器

图片 9

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

db.users.updateMany(
{},
{$push:
   {comments:
      {
        $each:[ {msg:"c7"}, {msg:"c8"}, {msg:"c9"}],
        $sort:{msg:-1},
        $slice:-5
      }
   }
}
)

在MongoDB中,更新单个doc的操作是原子性的。默认情况下,如果一个update操作更新多个doc,那么对每个doc的更新是原子性的,但是对整个update 操作而言,不是原子性的,可能存在前面的doc更新成功,而后面的doc更新失败的情况。由于更新单个doc的操作是原子性的,如果两个更新同时发生,那么一个更新操作会阻塞另外一个,doc的最终结果值是由时间靠后的更新操作决定的。

创建示例collection,使用db.collection.insert()函数和数组参数,一次性向集合中插入3个doc。

既然是数组,我们当然可以通过下标来访问,如下一行操作表示将下标为0的(第一个comments)comments修改为999:

示例,向comments 数组中插入三个messge

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

因此,只要数组中有任何一个元素满足qeury filter,就算满足qeury filter,这3个数组都满足query filter。
示例2,query filter:{grades:90}

$

查询结果是:

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

"errmsg" : "The positional operator did not find the match needed from the query. Unexpanded update: comments.$.unlikes"

{
 "_id" : ObjectId("59f042cfcafd355da9486008"),
 "name" : "三国演义",
 "author" : {
 "name" : "明代罗贯中",
 "gender" : "男",
 "age" : 100.0
 },
 "comments" : [ 
 "111", 
 "222", 
 "333", 
 "444", 
 "555"
 ]
}

如果不知道数组元素的下标,MongoDB提供占位符 $,用于表示从数组中查找满足query filter的第一个元素。占位符 $ 需要对数组进行查找,查找的query filter必须显式提供,如果存在数据元素满足query filter,那么$ 占位符表示第一个匹配的数组元素的position,如果没有数组元素满足query filter,那么MongoDB不会对数据任何作用。

$pull

查询结果是:只有_id为1的doc的数组元素82满足query filter

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

如果要向数组中增加或删除一个元素,$set和$inc 都不能很好的满足这种需求,MongoDB有专用的 Array Operator,用于修改数组字段。

save是shell中的一个函数,接收一个参数,这个参数就是文档,如果文档中有_id参数save会执行更新操作,否则执行插入操作,使用save操作我们可以方便的完成一些更新操作。

示例2,对数组元素进行查询,只要存在任何一个元素的msg字段的值c4,就在该元素中增加一个unlikes字段,并初始化为1.

{ "_id" : ObjectId("59f02dce95769f660c09955b"), "x" : 99 }

5,对数组字段的元素进行排序

db.sang_collect.update({class:"三年级二班"},{$push:{students:{$each:[{name:"张一百",score:100},{name:"张九九",score:99},{name:"张九八",score:98}],$slice:5,$sort:{score:-1}}}})

说明 query filter 不能使用empty filter,必须显式提供query filter。

此时不存在comments字段,系统会自动帮我们创建该字段,结果如下:

db.users.updateMany(
{},
{$addToSet:
   {comments:[ {msg:"c7"}, {msg:"c8"}, {msg:"c9"}] }
}
)

执行结果如下:

图示,删除数组中msg字段是"c7"的所有元素

db.sang_collect.update({name:"三国演义"},{$push:{comments:"好书666"}})

$push 修改器每次只能向数组字段的尾部插入一个元素,搭配使用$each 修改器,每次能向数组字段中插入多个元素

但我们发现执行结果却是这样:

db.collection.find( { array: { $size: n } } );
{
 "_id" : ObjectId("59f042cfcafd355da9486008"),
 "name" : "三国演义",
 "author" : {
 "name" : "明代罗贯中",
 "gender" : "男",
 "age" : 100.0
 },
 "comments" : [ 
 "好书666"
 ]
}

如果有以下三个doc,每个doc中都有一个grades 数组:

1.《MongoDB权威指南第2版》

如果不使用$position 修改器,那么 $push 每次都向数组的末尾写入元素;使用$position 修改器,指定$push插入元素的开始位置。

db.sang_collect.update({name:"三国演义"},{$inc:{"author.age":1}})

address 字段是内嵌文档,查找phone是123的doc

很多时候我们修改文档,只是要修改文章的某一部分,而不是全部,但是现在我面临这样一个问题,假设我有如下一个文档:

3,$set 和 $inc的不同之处在于:$set是替换现有字段的值,而$inc是在现有字段值的基础上,增加或减少指定的数值

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

在MongoDB中,修改操作主要使用两个修改器:$set 和 $inc,这两个修改器具有upsert特性:如果doc中存在相应的字段,那么修改该字段的值;如果doc中不存在相应的字段,那么在doc中创建新的字段。$inc用于整数型字段,增加或减少字段的值,$set用于任意数据类型,替换字段的值。

db.sang_collect.update({name:"三国演义"},{$push:{comments:{$each:["444","555"],$slice:-5}}})
db.users.updateMany(
{},
{$push:
   {
     comments:{ $each:[ {msg:"c3"}, {msg:"c4"} ] }
   }
}
)

前言

db.users.updateMany(
{},
{$inc:{"comments.0.likes":1}}
)

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

示例,对于以下集合,每个doc中都有一个数组字段qty,每个数组中包含三个元素,每个元素都是内嵌doc。

本文由wns9778.com发布于计算机教程,转载请注明出处:MongoDB中文档的更新操作示例详解

关键词: wns9778.com

上一篇:Redis 持久化之RDB和AOF

下一篇:没有了