MongoDB中数组类型相关的 *** 作

MongoDB中数组类型相关的 *** 作,第1张

概述概述 在MongoDB的模式中,我们经常将一些数据存储到数组类型中,即我们常见的嵌套模式设计的一种实现方式。数组的这种设计实现方式在关系数据库中是没有或者说不常见的。所以,通过本文我们来梳理一下Mon 概述

在MongoDB的模式中,我们经常将一些数据存储到数组类型中,即我们常见的嵌套模式设计的一种实现方式。数组的这种设计实现方式在关系数据库中是没有或者说不常见的。所以,通过本文我们来梳理一下MongoDB的数组的相关 *** 作。关于数组的 *** 作可以分成两类,一类是数组 *** 作符,另一个是数组运算修饰符。

 数组 *** 作符

*** 作符实现功能
$根据查询选择器定位要更新的文档
$push添加值到数组中
$pushAll添加数组到一个数组中。(将被$rach取代)
$addToSet

添加值到数组中,重复了也不处理

$pop从数组中删除第一个或者最后一个值。
$pull从数组中删除匹配查询条件的值。
$pullAll从数组中删除多个值。

数组运算修饰符

修饰符实现功能
$each与$push和$addToSet一起使用来 *** 作多个值。
$slice与$push和$each一起使用来缩小更新后数组的大小。
$sort与$push、$each、$slice一起来排序数组中的子文档。

 

1.$push *** 作符1.1 语法及功能描述

$push 主要用来向数组中添加元素。

语法:

{ $push: { <fIEld1>: <value1>,... } }

默认情况下,它会在数组尾部添加一个单独的元素。

1.2 *** 作案例

假如我们有一个学生成绩的集合studentscore,其文档格式如下:

{ "_ID" : 1,"name" : "xiaoming","score" : [ { "math" : 99,"english" : 89 } ] }{ "_ID" : 2,"name" : "xiaohong",1)"> { "math" : 98,"english" : 96 } ] }

其中的需求为,更新_ID 为1的文档记录,在分数数组的字段上,添加 物理学的成绩,修改代码为

db.studentscore.update({_ID:1},{$push: {score:{"physics":100}}})

修改后,结果查询如下:

{ "_ID" : ] }
 1.3 结合$each修饰符,批量插入

如果一次将多个值添加到数组中,可结合 数组修改符  $each 一起使用。

例如,我们将小红的(_ID =2)的物理成绩、化学成绩、生物成绩一起添加到文档中。执行的语句如下:

db.studentscore.update({ _ID: 2 },{        $push: {            score: {                $each: { "physics": 100 },{ "chemistry": 90 },{ "biology": 99 }            }        }    })

查询的结果如下:

{ "_ID" : ] }
1.4 数组修饰符 $sort 和 $slice的使用

前面讲了$each 数组运算修饰符,那我们再举一个例子,将剩余的两个修饰符一起讲解了好了($sort 和 $slice)

例如,我们有文档记录如下:

{   "_ID" : 5,"quizzes" :       { "wk": 1,"score" : 10 },{ "wk": 2,"score" : 8 },{ "wk": 3,"score" : 5 },{ "wk": 4,"score" : 6 }   }

现在我们,有个需求,就是 首先向文档的quizzes数组字段,追加三个记录,然后,我们再按照score排序,选取数组中的前三个元素。

db.students.update(   { _ID:  { wk: 5,score: 8 },{ wk: 6,score: 7 },{ wk: 7,score: 6 } -13       }     }   })

更新后的结果显示如下:

{  "_ID" :      { "wk" : 1,{ "wk" : 2,{ "wk" : 5,"score" : 8 }  }

 $slice *** 作修饰符是在MongoDB 2.4 里添加的,其目的是方便管理经常更新的数组。当向数组添加值但是不想数组太大的时候,这个 *** 作符非常有用。它必须与$push、$each *** 作符一起使用,允许用来剪短数组的大小、删除旧的值。

与$slice *** 作修饰符很像,MongoDB 2.4 新增了$sort *** 作修饰符,帮助更新数组。当使用$push和$slice时,有时候要先排序再删除它们。

2. $pop *** 作符2.1 语法及功能描述

$pop *** 作符可以实现从数组中删除第一个或者是最好一个元素。

{ $pop: { <fIEld<-1 | 1 8,9,10 ] }

我们的需求是要把数组中的第一个元素(成绩为8)移除,sql 语句如下:

db.students.update( { _ID: 1 },{ $pop: { scores: 1 } } )

更新后,文档如下

{ _ID:  9,1)">] }

继续演示,如果在现有的基础上,我们需要进一步把数组的最后一个元素移除(成绩为10),更新的sql如下:

db.students.1 } } )

查询结果 如下:

{ _ID:  9 ] }
3. $pull *** 作符3.1 语法及功能描述

$pull是$pop的复杂形式。使用$pull,可以通过值精确指定要删除的元素。

语法格式

{ $pull: { <value|condition<fIEld2{   _ID:  "apples","pears","oranges","grapes","bananas"  "carrots","celery","squash","carrots" }{   _ID:  "plums","kiwis","bananas","apples"  "broccoli","zucchini","carrots","onions" }

*** 作要求是将 数组字段fruits中的"apples" and "oranges" 移除,还要将vegetables数组字段中的"carrots" 移除,其更新语句如下:

db.stores.(    { },{ $pull: { fruits: { $in: 

更新后的结果如下:

 "pears","vegetables" :  "celery","squash" }{  "_ID" : }

 此时,集合文档中,fruit的数组字段 没有apples也没有oranges,vegetables数组字段也没有了carrots。

3.2.2 移除数组中满足指定条件的元素

假如我们有一个 profiles 的集合,其文档格式如下:

{ _ID:  3,5,6,7,8 ] }

我们要把Votes大于等于6的元素移除,其语句如下:

db.profiles.6 } } } )

更新后的结果如下:

{ _ID:   3,5 ] }
3.2.3 移除数组中内嵌子文档(即此时数组元素是子文档,每一个{}中的内容是一个数组元素)

假设我们有一个关于 调查的集合 survey,其数据如下:

      { item: "A",score: 5 },{ item: "B",score: 8,comment: "Strongly agree" }         { item: "C",comment: "Strongly agree" },score: 4 }   }

需求是将 score 为 8 并且 item 为 "B"的元素移除

db.survey.(  { },{ $pull: { results: { score: 8

更新后的文档如下:

 { "item" : "A","score" : 5 }       { "item" : "C","score" : 8,"comment" : "Strongly agree" },{ "item" : "B","score" : 4 }   }
3.2.4 如果数组类型的元素还内嵌一个数组(数组包数组),就要特别小心了。

此时就要用到 $elemmatch *** 作符。

例如 文档格式如下:

8,answers:  { q: 1,a: 8 },a: 9 }  }   ]}{   _ID: 4,a: 0 },a: 8 }  }   ]}

需要将 results数组字段 移除,移除的条件是 results数组字段中的answers字段,符合  q 为 2 and a 大于等于 8。

db.survey. } } } } } },{ multi: true })

更新后的数据如下:

      { "item" : "A","score" : 5,"answers" : [ { "q" : 1,"a" : 4 },{ "q" : 2,"a" : 6 }  }   ]}{   "_ID" :  }   ]}
4.$addToSet4.1 语法及功能描述

使用$addToSet也会往数组后面添加值,但是它比较特殊:它只会添加数组里不存在的值。

{ $addToSet: { inventory  格式如下

{ _ID:  "electronics","camera" ] }

 我们希望向向字段 Tags 数组 ,添加一个元素accessorIEs,则更新语句如下:

db.inventory.

更新后的结果为 

{ "_ID" : ] }

如果想批量的增加如果元素,我们可以结合 $each *** 作符一起使用。

例如以下文档

{ _ID: ] }

我们想在字段 Tags 数组,添加元素 "camera","electronics","accessorIEs",则更新语句如下:

db.inventory. "camera","electronics",1)"> } } } )

更新后的结果如下:

{  _ID: }
4.3 注意点

需要注意是,如果添加的元素是数组格式,则会将新添加的元素保留为数组(将会出现数组嵌套数组)

例如

{ _ID: "a","b"] }

执行的语句如下:

db.test. "c","d"  } })

查询结构显示为

{ _ID:  "a","b",[ "c",1)">] ] }

 

本文部分例子来自官网及网络,在此感谢。

本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!

总结

以上是内存溢出为你收集整理的MongoDB中数组类型相关的 *** 作全部内容,希望文章能够帮你解决MongoDB中数组类型相关的 *** 作所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1153986.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存