百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> MongoDB中数组类型的操纵(代码示例)
分享文章到:

MongoDB中数组类型的操纵(代码示例)

发布时间:08/01 来源:未知 浏览: 关键词:
?本篇文章给大家带来的内容是对于MongoDB中数组类型的操纵(代码示例),有一定的参照 价值,有需要的伴侣可以参照 一下,但愿对你有所帮忙。 本篇文章给大家带来的内容是对于MongoDB中数组类型的操纵(代码示例),有一定的参照 价值,有需要的伴侣可以参照 一下,但愿对你有所帮忙。

在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: { : , ... } }

默许状况下,它会在数组尾部增加一个独自的元素。

1.2 操纵案例

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

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

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

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

修改后,效果查询如下:

{ "_id" : 1, "name" : "xiaoming", "score" : [ { "math" : 99, "english" : 89 }, { "physics" : 100 } ] }
{ "_id" : 2, "name" : "xiaohong", "score" : [ { "math" : 98, "english" : 96 } ] }

1.3 联合$each润饰符,大量插入

要是一次将多个值增加到数组中,可联合 数组修改符 $each 一起运用。

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

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

        }
    }
)

查询的效果如下:

{ "_id" : 1, "name" : "xiaoming", "score" : [ { "math" : 99, "english" : 89 }, { "physics" : 100 } ] }
{ "_id" : 2, "name" : "xiaohong", "score" : [ { "math" : 98, "english" : 96 }, { "physics" : 100 }, { "chemistry" : 90 }, { "biology" : 99 } ] }

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: 5 },
   {
     $push: {
       quizzes: {
          $each: [ { wk: 5, score: 8 }, { wk: 6, score: 7 }, { wk: 7, score: 6 } ],
          $sort: { score: -1 },
          $slice: 3
       }
     }
   }
)

更新后的效果显示如下:

{
  "_id" : 5,
  "quizzes" : [
     { "wk" : 1, "score" : 10 },
     { "wk" : 2, "score" : 8 },
     { "wk" : 5, "score" : 8 }  ]}

$slice操纵润饰符是在MongoDB 2.4 里增加的,其目的是利便治理时常更新的数组。当向数组增加值但是不想数组太大的时候,这个操纵符非常实用。它必需与$push、$each操纵符一起运用,允许用来剪短数组的大小、删除旧的值。

与$slice操纵润饰符很像,MongoDB 2.4 新增了$sort操纵润饰符,帮忙更新数组。当运用$push和$slice时,有时候要先排序再删除它们。

2. $pop 操纵符

2.1 语法及功能描述

$pop操纵符可以实现从数组中删除首先个或者是最佳一个元素。

{ $pop: { : <-1 | 1>, ... } }

参数为-1 ,代表要删除数组中的首先个元素;参数为1 ,代表要删除数组中的最后一个元素。

2.2 操纵案例

例如汇合students 中有下列文档:

{ _id: 1, scores: [ 8, 9, 10 ] }

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

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

更新后,文档如下

{ _id: 1, scores: [ 9, 10 ] }

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

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

查询效果 如下:

{ _id: 1, scores: [ 9 ] }

3. $pull操纵符

3.1 语法及功能描述

$pull是$pop的复杂情势。运用$pull,可以通过值精准指定要删除的元素。

语法格局

{ $pull: { : , : , ... } }

3.2 操纵案例

3.2.1 移除数组中等于指定值的元素

测试文档如下:

{
   _id: 1,
   fruits: [ "apples", "pears", "oranges", "grapes", "bananas" ],
   vegetables: [ "carrots", "celery", "squash", "carrots" ]}
{
   _id: 2,
   fruits: [ "plums", "kiwis", "oranges", "bananas", "apples" ],
   vegetables: [ "broccoli", "zucchini", "carrots", "onions" ]}

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

db.stores.update(
    { },
    { $pull: { fruits: { $in: [ "apples", "oranges" ] }, vegetables: "carrots" } },
    { multi: true }
)

更新后的效果如下:

{
  "_id" : 1,
  "fruits" : [ "pears", "grapes", "bananas" ],
  "vegetables" : [ "celery", "squash" ]}
{
  "_id" : 2,
  "fruits" : [ "plums", "kiwis", "bananas" ],
  "vegetables" : [ "broccoli", "zucchini", "onions" ]}

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

3.2.2 移除数组中知足指定前提的元素

假设我们有一个 profiles 的汇合,其文档格局如下:

{ _id: 1, votes: [ 3, 5, 6, 7, 7, 8 ] }

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

db.profiles.update( { _id: 1 }, { $pull: { votes: { $gte: 6 } } } )

更新后的效果如下:

{ _id: 1, votes: [  3,  5 ] }

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

假如我们有一个对于 观察的汇合 survey,其数据如下:

{
   _id: 1,
   results: [
      { item: "A", score: 5 },
      { item: "B", score: 8, comment: "Strongly agree" }   ]}
{
   _id: 2,
   results: [
      { item: "C", score: 8, comment: "Strongly agree" },
      { item: "B", score: 4 }   ]}

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

db.survey.update(
  { },
  { $pull: { results: { score: 8 , item: "B" } } },
  { multi: true }
)

更新后的文档如下:

{
   "_id" : 1,
   "results" : [ { "item" : "A", "score" : 5 } ]}
{
  "_id" : 2,
  "results" : [
      { "item" : "C", "score" : 8, "comment" : "Strongly agree" },
      { "item" : "B", "score" : 4 }   ]}

3.2.4 要是数组类型的元素还内嵌一个数组(数组包数组),就要特殊当心了。

此时就要用到 $elemMatch操纵符。

例如 文档格局如下:

{
   _id: 1,
   results: [
      { item: "A", score: 5, answers: [ { q: 1, a: 4 }, { q: 2, a: 6 } ] },
      { item: "B", score: 8, answers: [ { q: 1, a: 8 }, { q: 2, a: 9 } ] }
   ]
}
{
   _id: 2,
   results: [
      { item: "C", score: 8, answers: [ { q: 1, a: 8 }, { q: 2, a: 7 } ] },
      { item: "B", score: 4, answers: [ { q: 1, a: 0 }, { q: 2, a: 8 } ] }
   ]
}

需要将 results数组字段 移除,移除的前提是 results数组字段中的answers字段,相符 q2 and a 大于等于 8。

db.survey.update(
  { },
  { $pull: { results: { answers: { $elemMatch: { q: 2, a: { $gte: 8 } } } } } },
  { multi: true }
)

更新后的数据如下:

{
   "_id" : 1,
   "results" : [
      { "item" : "A", "score" : 5, "answers" : [ { "q" : 1, "a" : 4 }, { "q" : 2, "a" : 6 } ] }
   ]
}
{
   "_id" : 2,
   "results" : [
      { "item" : "C", "score" : 8, "answers" : [ { "q" : 1, "a" : 8 }, { "q" : 2, "a" : 7 } ] }
   ]
}

4.$addToSet

4.1 语法及功能描述

运用$addToSet也会往数组背面增加值,但是它比拼特别:它只会增加数组里不存在的值。

{ $addToSet: { : , ... } }

4.2 操纵案例

假设有一个汇合 inventory 格局如下

{ _id: 1, item: "polarizing_filter", tags: [ "electronics", "camera" ] }

我们但愿向向字段 tags 数组 ,增加一个元素accessories,则更新语句如下:

db.inventory.update(
   { _id: 1 },
   { $addToSet: { tags: "accessories" } }
)

更新后的效果为

{ "_id" : 1, "item" : "polarizing_filter", "tags" : [ "electronics", "camera", "accessories" ] }

要是想大量的添加要是元素,我们可以联合 $each 操纵符一起运用。

例如下列文档

{ _id: 2, item: "cable", tags: [ "electronics", "supplies" ] }

我们想在字段 tags 数组,增加元素 "camera", "electronics", "accessories",则更新语句如下:

db.inventory.update(
   { _id: 2 },
   { $addToSet: { tags: { $each: [ "camera", "electronics", "accessories" ] } } }
 )

更新后的效果如下:

{
  _id: 2,
  item: "cable",
  tags: [ "electronics", "supplies", "camera", "accessories" ]}

4.3 注意点

需要注意是,要是增加的元素是数组格局,则会将新增加的元素保存为数组(将会涌现数组嵌套数组)

例如

{ _id: 1, letters: ["a", "b"] }

施行的语句如下:

db.test.update(
   { _id: 1 },
   { $addToSet: {letters: [ "c", "d" ] } }
)

查询构造显示为

{ _id: 1, letters: [ "a", "b", [ "c", "d" ] ] }

以上就是MongoDB中数组类型的操纵(代码示例)的细致内容,更多请关注 百分百源码网 其它相干文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有152人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板