广告
返回顶部
首页 > 资讯 > 数据库 >MongoDB中数组类型的操作示例
  • 644
分享到

MongoDB中数组类型的操作示例

2024-04-02 19:04:59 644人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关mongoDB中数组类型的操作示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在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: { <field1>: <value1>, ... } }

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

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: { <field>: <-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: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }
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: { <field1>: <value1>, ... } }
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中数组类型的操作示例就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: MongoDB中数组类型的操作示例

本文链接: https://www.lsjlt.com/news/53623.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MongoDB中数组类型的操作示例
    这篇文章将为大家详细讲解有关MongoDB中数组类型的操作示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在MongoDB的模式中,我们经常将一些数据存储到数组类型中,...
    99+
    2022-10-18
  • 基于MongoDB数据库中数据类型和$type操作符的示例分析
    这篇文章将为大家详细讲解有关基于MongoDB数据库中数据类型和$type操作符的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前面的话  本文将详细介绍Mong...
    99+
    2022-10-18
  • PostgreSQL -- 数组类型操作
    一、数组类型创建表 数组类型,要求数组内的元素属于同一种类型,当出现No function matches the given name and argument types. You might need...
    99+
    2022-10-18
  • JavaScript数组的操作示例
    这篇文章主要介绍了JavaScript数组的操作示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:数组及操作方法数组就是一组数据的...
    99+
    2022-10-19
  • Java操作MongoDB数据库的示例代码
    目录环境准备 1.数据库操作 1.1获取所有数据库1.2获取指定库的所有集合名1.3.删除数据库2.文档操作 2.1插入文档 2.2查询文档 2.3分页查询 2.4修改文档2.5 删...
    99+
    2022-11-12
  • Oracle中CLOB大数据字段类型操作的示例分析
    这篇文章主要为大家展示了“Oracle中CLOB大数据字段类型操作的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Oracle中CLOB大数据字段类型操...
    99+
    2022-10-18
  • ​Jedis对redis五大类型的操作示例
    这篇文章给大家分享的是有关Jedis对redis五大类型的操作示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Jedis对redis的五大类型的操作:字符串、列表、散列、集合、...
    99+
    2022-10-18
  • Elasticsearch的删除映射类型操作示例
    目录一 前言二 什么是映射类型?三 为什么要删除映射类型?四 映射类型的替代方法4.1 将映射类型分开存储在索引中4.2 自定义类型字段回到顶部五 没有映射类型的父/子六 删除映射类...
    99+
    2022-11-13
  • MongoDB 常用的数据类型和基本操作
    目录NO.1 MongoDB的常用数据类型1、null2、bool3、整数4、字符串5、对象id6、日期类型7、数组8、内嵌文档9、代码NO.2 集合文档的基本操作集合相关操作1、查...
    99+
    2022-11-11
  • node.js操作mongoDB数据库示例分享
    连接数据库 var mongo=require("mongodb"); var host="localhost"; var port=mongo.Connection.DEFAULT_PORT; ...
    99+
    2022-06-04
    示例 操作 数据库
  • java泛型数组转换类型的示例分析
    小编给大家分享一下java泛型数组转换类型的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用来表示小数的数据...
    99+
    2023-06-14
  • MongoDB数据库基础操作的示例分析
    这篇文章将为大家详细讲解有关MongoDB数据库基础操作的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。为了保存网站的用户数据和业务数据,通常需要一个数据库。Mo...
    99+
    2022-10-18
  • java数组及arrays类对数组的操作实例
    数组的初始化有两种方式静态初始化: 初始化时由程序员显示置顶每个数组的初始值,由系统决定数组长度。如:int[] a1 = new int[] {1,2,3,4};...
    99+
    2023-05-31
    数组 arrays
  • MongoDB操作符中$elemMatch问题的示例分析
    小编给大家分享一下MongoDB操作符中$elemMatch问题的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!问题如果...
    99+
    2022-10-18
  • Jedis对redis五大类型操作的示例分析
    小编给大家分享一下Jedis对redis五大类型操作的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!JedisUtil这里的测试用例采用junit4进行运行,准备代码如下:private static&n...
    99+
    2023-05-30
    redis jedis
  • vue.js数组中常用操作的示例分析
    这篇文章将为大家详细讲解有关vue.js数组中常用操作的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。数组的相关方法如下1,锁定数组的长度(只读模式)[ Arra...
    99+
    2022-10-19
  • JavaScript中数组各种操作的示例分析
    这篇文章主要介绍JavaScript中数组各种操作的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!声明一个数组原来是如下声明:var s = new Array();但是 现...
    99+
    2022-10-19
  • array_values()在php中返回数组的操作示例
    这篇文章给大家分享的是有关array_values()在php中返回数组的操作示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php有什么特点1、执行速度快。2、具有很好的开放性和可扩展性。3、PHP支持多种主...
    99+
    2023-06-14
  • java操作mongoDB查询的示例分析
    小编给大家分享一下java操作mongoDB查询的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!java操作mongo查...
    99+
    2022-10-18
  • PHP8中的数组函数:array_intersect_assoc()的多种操作示例
    PHP语言作为一种广泛应用于Web开发和服务器端脚本编程的语言,其强大的数组函数支持是其优秀性能的重要组成部分之一。在PHP8中,新的数组函数array_intersect_assoc()被引入,它在操作关联数组时具有更高效的性能和更方便的...
    99+
    2023-05-18
    PHP 数组函数 array_intersect_assoc()
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作