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",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
{ _id:  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.$addToSet

4.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)">] ] }

 

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读552次。com.mongodb.MongoQueryException: Query failed with error code 292 and error message 'Executor error during find command :: caused by :: Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting.' on server 11.51.141.63:27017 _mongodb 大文件 下载失败
文章浏览阅读635次,点赞9次,收藏8次。MongoDB 是一种 NoSQL 数据库,它将每个数据存储为一个文档,这里的文档类似于 JSON/BSON 对象,具体数据结构由键值(key/value)对组成。
文章浏览阅读2.1k次。和。_mongodb 日期类型
文章浏览阅读1.7k次。Scalestack等客户期待使用MongoDB Atlas Vector Search和Amazon Bedrock构建下一代应用程序
文章浏览阅读970次。SpringBoot整合中间件mongodb、ES_springboot3 elasticsearch json数据
文章浏览阅读673次。MongoDB 简介_尚医通sql
文章浏览阅读1k次,点赞8次,收藏9次。官网下载MongoDB安装包后进行解压(因了解并不深入,故暂不进行详细说明,自行查找其他安装方法,后期了解深入后将进行该教程的完善)在bin目录下使用命令启动:./mongod --config …/mongodb.conf。该文章任然处于完善中,如果存在错误遗漏的地方,欢迎私信联系。安装相关的nuget包后即可通过以下方法连接数据。YX9010_0@的第二十篇文章。
文章浏览阅读1.2k次,点赞17次,收藏26次。社交场景, 使用 MongoDB 存储存储用户信息, 以及用户发表的朋友圈信息, 通过地理位置索引实现附近的人, 地点等功能.游戏场景, 使用 MongoDB 存储游戏用户信息, 用户的装备, 积分等直接以内嵌文档的形式存储, 方便查询, 高效率存储和访问.物流场景, 使用 MongoDB 存储订单信息, 订单状态在运送过程中会不断更新, 以 MongoDB 内嵌数组的形式来存储, 一次查询就能将订单所有的变更读取出来.物联网场景, 使用 MongoDB 存储所有接入的智能设备信息, 以及设备汇报的日
文章浏览阅读686次。您可以使用 update_one() 方法来更新 MongoDB 中调用的记录或文档。update_one() 方法的第一个参数是 query 对象,用于定义要更新的文档。注释:如果查询找到多个记录,则仅更新第一个匹配项。第二个参数是定义文档新值的对象。_python 更新 mongodb 数据
文章浏览阅读1.3k次。首先来学习一下nosql这里安装就不进行介绍 只记录一下让自己了解mongodb。_nosql注入
文章浏览阅读4.1k次,点赞8次,收藏7次。在data的目录下,创建一个db文件。因为启动MongoDB服务之前必须创建数据库文件的存放文件夹,否则命令不会自动创建,而且不能启动成功。第一步:安装时,Custom是指可以自定义安装路径,然后傻瓜式安装即可(注意:先不要安装图形化工具,否则安装时间会特别长):如果要想连接成功,必须要开服务,即mongod -dbpath C:MongoDBdatadb的cmd要一直开着。然后回车,ctrl+F输入port找到端口号,一般为:27017。打开命令行,然后找到bin文件地址,并输入。_mongodb windows安装
文章浏览阅读5.1k次,点赞3次,收藏43次。详细介绍MongoDB数据库的基本知识,安装方法,基本操作,_mongodb数据库
文章浏览阅读3.2k次。安装教程翻看以往文章。_navicat 连接mongodb
文章浏览阅读426次,点赞9次,收藏12次。win10开放端口:https://blog.csdn.net/m0_43605481/article/details/119255256。我的是阿里云服务器,所以直接在安全组中加入规则,端口范围:27017,授权对象:0.0.0.0。windows在mongodb安装文件夹的bin文件夹中的mongod.cfg。数据库名字是test,打算创建一个用户,账号aaa,密码bbb,权限readWrite。因为该用户是创建在test数据库的,所以在最后要加上test。O了,然后恢复了test的数据。
文章浏览阅读1.1k次。聚合操作主要用于处理数据并返回计算结果。聚合操作将来自多个文档的值组合在一起,按条件分组后,再进行一系列操作(如求和、平均值、最大值、最小值)以返回单个结果。MongoDB的聚合查询​聚合是MongoDB的高级查询语言,它允许我们通过转化合并由多个文档的数据来生成新的在单个文档里不存在的文档信息。MongoDB中聚合(aggregate)主要用于处理数据(例如分组统计平均值、求和、最大值等),并返回计算后的数据结果,有点类似sql语句中的count(*)、groupby。..._如何将几个db的数据统整在一起做查询
文章浏览阅读680次,点赞7次,收藏8次。(2)application.properties配置文件。(4)UserService类。(5)测试和测试结果。
文章浏览阅读1k次,点赞17次,收藏25次。Studio 3T 2023.9 (macOS, Linux, Windows) - MongoDB 的专业 GUI、IDE 和 客户端,支持自然语言查询_mongodb客户端
文章浏览阅读1.1k次,点赞32次,收藏27次。插件式的存储引擎架构可以实现 Server 层和存储引擎层的解耦,可以支持多种存储引擎,如 MySQL 既可以支持 B-Tree 结构的 InnoDB 存储引擎,还可以支持 LSM 结构的 RocksDB 存储引擎。MongoDB 中的记录就是一个 BSON 文档,它是由键值对组成的数据结构,类似于 JSON 对象,是 MongoDB 中的基本数据单元。的简称,是 JSON 文档的二进制表示,支持将文档和数组嵌入到其他文档和数组中,还包含允许表示不属于 JSON 规范的数据类型的扩展。
文章浏览阅读5.1k次,点赞6次,收藏96次。本文设计了一种基于智能室内温度控制的自动调速风扇。以STM32系列单片机为核心主控板,通过程序代码驱动和使用温度传感器模块实现对环境温度的实时监测,并可以实时显示环境温度。同时,可以设置温度检测的上下警告值,根据需求自行调节。_stm32 温控风扇
文章浏览阅读898次,点赞13次,收藏21次。在MongoDB中,我们使用find()和find_one()方法来在集合中查找数据,就像在MySQL数据库中使用SELECT语句来在表中查找数据一样。_pymongo find_one