MongoDB(11)- 查询数组

摘要:
插入测试数据数据库。库存插入多个([{item:“日记账”,数量:25,标签:[“空白”,“红色”],dim_cm:[14,21]},{item:“笔记本”,数量为50,标签:“红色”,“空白”],dim_cm:[14,21]},{项目:“纸张”,数量100,标签:〔“红色”、“空白”、“普通”

插入测试数据

db.inventory.insertMany([
   { item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] },
   { item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] },
   { item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] },
   { item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] },
   { item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ] }
]); 

后面的栗子都会用到这里的测试数据

精确匹配数组

> db.inventory.find( { tags: ["red", "blank"] } )
{ "_id" : ObjectId("60b5fb209ba88b2120d5de24"), "item" : "notebook", "qty" : 50, "tags" : [ "red", "blank" ], "dim_cm" : [ 14, 21 ] }

不仅数组的值要完全一致,顺序也得保持一致

$all 操作符

如果希望找到的是包含 red、blank 两个元素的数组,可以使用 $all 操作符

> db.inventory.find({tags:{$all:["red","blank"]}})
{ "_id" : ObjectId("60b5fb209ba88b2120d5de23"), "item" : "journal", "qty" : 25, "tags" : [ "blank", "red" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de24"), "item" : "notebook", "qty" : 50, "tags" : [ "red", "blank" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de25"), "item" : "paper", "qty" : 100, "tags" : [ "red", "blank", "plain" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de26"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }

后面再展开细讲这个操作符

查询数组字段包含一个指定值元素的所有文档

> db.inventory.find( { tags: "red" } )
{ "_id" : ObjectId("60b5fb209ba88b2120d5de23"), "item" : "journal", "qty" : 25, "tags" : [ "blank", "red" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de24"), "item" : "notebook", "qty" : 50, "tags" : [ "red", "blank" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de25"), "item" : "paper", "qty" : 100, "tags" : [ "red", "blank", "plain" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de26"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }

找到 tags 字段包含 red 元素的所有文档

对数组字段中的元素指定单个条件

语法格式

{ <array field>: { <operator1>: <value1>, ... } }
{ 数组字段名 : { 操作符:值, 操作符2: 值2, ..... }}

实际栗子

查询数组 dim_cm 中至少包含一个值大于 25 的元素的所有文档

> db.inventory.find( { dim_cm: { $gt: 25 } } )
{ "_id" : ObjectId("60b5fb209ba88b2120d5de26"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }

对数组元素指定多个条件

在数组元素上指定复合条件时,可以指定查询使得单个数组元素满足这些条件或数组元素的任意组合满足条件

在数组元素上使用复合条件

> db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )
{ "_id" : ObjectId("60b5fb209ba88b2120d5de23"), "item" : "journal", "qty" : 25, "tags" : [ "blank", "red" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de24"), "item" : "notebook", "qty" : 50, "tags" : [ "red", "blank" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de25"), "item" : "paper", "qty" : 100, "tags" : [ "red", "blank", "plain" ], "dim_cm" : [ 14, 21 ] }
{ "_id" : ObjectId("60b5fb209ba88b2120d5de27"), "item" : "postcard", "qty" : 45, "tags" : [ "blue" ], "dim_cm" : [ 10, 15.25 ] }

 dim_cm 数组包含在某种组合中满足查询条件的元素

  1. 满足大于 15 的条件
  2. 满足小于20的条件
  3. 同时满足这两个条件

多个条件是或的关系

查询满足多个条件的数组元素

上面的栗子虽然指定了复合条件,但只需要满足其中一个就匹配成功

如果想必须同时满足多个条件呢?

使用 $elemMatch 运算符在数组元素上指定多个条件,使得至少一个数组元素满足所有指定条件

小栗子

查询 dim_cm 数组包含至少一个大于 ($gt) 22 且小于 ($lt) 30 的元素的文档

> db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )
{ "_id" : ObjectId("60b5fb209ba88b2120d5de26"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }

  

按数组索引位置查询元素

查询 dim_cm 数组第二个元素大于 25 的文档(索引位置从 0 开始哦)

> db.inventory.find( { "dim_cm.1": { $gt: 25 } } )
{ "_id" : ObjectId("60b5fb209ba88b2120d5de26"), "item" : "planner", "qty" : 75, "tags" : [ "blank", "red" ], "dim_cm" : [ 22.85, 30 ] }

  

按数组长度查询数组

查询包含长度= 3 的 tags 数组的文档

> db.inventory.find( { "tags": { $size: 3 } } )
{ "_id" : ObjectId("60b5fb209ba88b2120d5de25"), "item" : "paper", "qty" : 100, "tags" : [ "red", "blank", "plain" ], "dim_cm" : [ 14, 21 ] }

  

免责声明:文章转载自《MongoDB(11)- 查询数组》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HTML学习案例-仿慕课网网页制作(二)R语言hist重叠图作法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

CDH-5.12.2安装教程

CDH是Cloudera公司提供的Hadoop发行版,它在原生开源的Apache Hadoop基础之上,针对特定版本的Hadoop以及Hadoop相关的软件,如Zookeeper、HBase、Flume、Sqoop等做了兼容性开发,我们在安装CDH发行版的Hadoop时就无需进行额外繁琐的兼容性测试。 以往安装配置使用Apache Hadoop时,完全需...

关于MongoDB的group用法

之前在看Mongo的书时,看到了聚合这章。其中谈到了group这个功能,其实正如书中所说,MongoDB中的group和SQL中的group by是很相似的,但我自我分析,可能由于Mongo中的group的使用形式不同,而且使用的是js语法,所以导致咋一看上去不明白这个group怎么用。下面通过具体的一个例子来详细说明Mongo的group用法。 我们平常...

MongoDB学习笔记(一) MongoDB介绍及安装

MongoDB简介 MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql 数据库中比较热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。Mongo使用C++开发。Mongo的官方网站地址是:http://www.mongodb.org/,读者可以在此获得更详细的信息。 特点 高性能、易部署、易使用,存储数据非常方便...

mongo部署(linux)

Linux版本:CentOS release 6.9 Mongodb版本:mongodb-linux-x86_64-3.6.1.tgz 1、解压文件 执行解压命令:tar -zxvf mongodb-linux-x86_64-3.6.1.tgz   2、创建数据,日志目录 命令:mkdir /my/mydata/mongodb       mkdir /m...

MongoDB GridFS 存储大文件

我们经常会遇到这样的场景:上传/下载文件。 有两种思路可以解决这个问题: (1)将文件存储在服务器的文件系统中; (2)将文件存储在数据库中。 如果我们选择(2),那么我们可以使用MongoDB GridFS 用于存储大小超过 16MB 的文件(文档,压缩文件,音视频,软件)。 一、MongoDB GridFS 介绍 MongoDB GridFS 是一个分...

Java泛型详解

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 假定我们有这样一个需求:写一个排序方法,能够对整形数组、字符串数组甚至其他任何类型的数组进行排序,该如何实现? 答案是可以使用 Java 泛型。 使用 Java 泛型的概念,我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数组、字符串数组等进行排序。...