本文将会介绍 MongoDB 中查找数组元素相关的运算符,包括 $size、$all 以及 $elemMatch。

$size 运算符

$size 是一个数组查询运算符,可以判断文档的字段是否包含指定数量的元素。

$size 运算符的语法如下:

{ array_field: {$size: element_count} }

其中,array_field 是字段名,element_count 表示该字段包含的元素数量。

接下来的示例将会使用以下集合:

db.products.insertMany([{ "_id" : 1, "name" : "xPhone", "price" : 799, "releaseDate" : ISODate("2011-05-14T00:00:00Z"), "spec" : { "ram" : 4, "screen" : 6.5, "cpu" : 2.66 }, "color" : [ "white", "black" ], "storage" : [ 64, 128, 256 ] },{ "_id" : 2, "name" : "xTablet", "price" : 899, "releaseDate" : ISODate("2011-09-01T00:00:00Z"), "spec" : { "ram" : 16, "screen" : 9.5, "cpu" : 3.66 }, "color" : [ "white", "black", "purple" ], "storage" : [ 128, 256, 512 ] },{ "_id" : 3, "name" : "SmartTablet", "price" : 899, "releaseDate" : ISODate("2015-01-14T00:00:00Z"), "spec" : { "ram" : 12, "screen" : 9.7, "cpu" : 3.66 }, "color" : [ "blue" ], "storage" : [ 16, 64, 128 ] },{ "_id" : 4, "name" : "SmartPad", "price" : 699, "releaseDate" : ISODate("2020-05-14T00:00:00Z"), "spec" : { "ram" : 8, "screen" : 9.7, "cpu" : 1.66 }, "color" : [ "white", "orange", "gold", "gray" ], "storage" : [ 128, 256, 1024 ] },{ "_id" : 5, "name" : "SmartPhone", "price" : 599, "releaseDate" : ISODate("2022-09-14T00:00:00Z"), "spec" : { "ram" : 4, "screen" : 9.7, "cpu" : 1.66 }, "color" : [ "white", "orange", "gold", "gray" ], "storage" : [ 128, 256 ] },{ "_id" : 6, "name" : "xWidget", "spec" : { "ram" : 64, "screen" : 9.7, "cpu" : 3.66 }, "color" : [ "black" ], "storage" : [ 1024 ] }
])

以下示例使用 $size 运算符查找数组字段 color 包含两个元素的文档:

db.products.find({color: {$size: 2}
}, {name: 1,color: 1
})

查询返回的文档如下:

{ "_id" : 1, "color" : [ "white", "black" ], "name" : "xPhone" }

以下示例同时使用了 $size 运算符和 $or 运算符查找数组字段 color 包含一个或者两个元素的文档:

db.products.find({$or: [{color: {$size: 1}},{color: {$size: 2}}]
}, {name: 1,color: 1
})

查询返回的结果如下:

{ "_id" : 1, "color" : [ "white", "black" ], "name" : "xPhone" }
{ "_id" : 3, "color" : [ "blue" ], "name" : "SmartTablet" }

$all 运算符

$all 是一个数组查询运算符,可以判断文档的字段是否包含指定的所有元素。

$all 运算符的语法如下:

{ <arrayField>: { $all: [element1, element2, ...]} }

如果 $all 运算符后面的数组为空,不会匹配任何文档。

如果 $all 运算符只有一个元素,应该使用表达式,而不是数组:

{ <arrayField>: element1 }

$all 运算符可以使用等价的 $and 运算符实现:

{ $and: [{ arrayField: element1}, {arrayField: element2} ]}

以下示例使用 $all 运算符查找 color 字段同时包含“black”和“white”两个元素的文档:

db.products.find({color: {$all: ["black", "white"]}
}, {name: 1,color: 1
})

查询返回的结果如下:

{ "_id" : 1, "name" : "xPhone", "color" : [ "white", "black" ] }
{ "_id" : 2, "name" : "xTablet", "color" : [ "white", "black", "purple" ] }

上面的示例也可以使用 $and 运算符实现:

db.products.find({$and: [{color: "black"},{color: "white"}]
}, {name: 1,color: 1
})

$elemMatch 运算符

$elemMatch 也是一个数组查询运算符,可以判断文档是否包含指定数组字段,并且该字段至少包含一个满足条件的元素。

$elemMatch 运算符的语法如下:

{ <arrayField>: {$elemMatch: { <query1>, <query2>, ...} } }

注意,$elemMatch 运算符不支持 $where 表达式或者 $text 查询表达式。

以下示例使用 $elemMatch 运算符查询 products 集合中的文档:

db.products.find({storage: {$elemMatch: {$lt: 128}}
}, {name: 1,storage: 1
});

查询返回了数组字段 storage 中至少包含一个小于 128 的元素的文档:

[{ _id: 1, name: 'xPhone', storage: [ 64, 128, 256 ] },{ _id: 3, name: 'SmartTablet', storage: [ 16, 64, 128 ] }
]

《MongoDB入门教程》第11篇 数组运算符相关推荐

  1. MongoDB 入门教程实战学习笔记-31-mongo 聚合查询管道 Aggregation Pipieline

    aggregation 聚合操作处理数据记录并返回计算结果. 聚合操作将多个文档中的值组合在一起, 并且可以对分组数据执行各种操作以返回单个结果. mongodb 提供了三种执行聚合的方法: 聚合管道 ...

  2. Systemd 入门教程:实战篇

    Systemd 入门教程:实战篇 原文出处: 阮一峰(@ruanyf)   http://blog.jobbole.com/98671/?utm_source=blog.jobbole.com& ...

  3. [Qt教程] 第11篇 2D绘图(一)绘制简单图形

    [Qt教程] 第11篇 2D绘图(一)绘制简单图形 楼主  发表于 2013-4-23 12:52:35 | 查看: 1398| 回复: 5 绘制简单图形 版权声明 该文章原创于Qter开源社区,作者 ...

  4. Linux Capabilities 入门教程--进阶实战篇

    该系列文章总共分为三篇: Linux Capabilities 入门教程:概念篇 Linux Capabilities 入门教程:基础实战篇 Linux Capabilities 入门教程:进阶实战篇 ...

  5. Linux Capabilities 入门教程--基础实战篇

    该系列文章总共分为三篇: Linux Capabilities 入门教程:概念篇 Linux Capabilities 入门教程:基础实战篇 Linux Capabilities 入门教程:进阶实战篇 ...

  6. Systemd入门教程:命令篇

    Systemd入门教程:命令篇 转自:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html 作者: 阮一峰 日期: ...

  7. 深度学习小白入门教程-基础环境篇

    深度学习小白入门教程-基础环境篇 如有图片显示失败,请回小主主页查看~ Anaconda 安装包下载方式一:官网(科学上网比较慢,不推荐) 安装包下载方式二:清华镜像(推荐) 具体安装步骤(跟着箭头来 ...

  8. 九宫怎么排列和使用_广告视频配音剪映零基础入门教程第二十三篇:剪辑之九宫格教程...

    朋友圈最火九宫格视频你们知道是怎样制作的吗?我们常常在玩朋友圈的时候想用九宫格照片,但是你们有没有遇到这种情况,想玩九宫格却发现找不到那么多能用的照片,那这时候怎么办呢?玩腻了平常图片的发法,今天我们 ...

  9. C++零基础入门教程:基础篇(一)

    前言 嘿嘿,我叕来啦─=≡Σ(((つ•̀ω•́)つ!别问我为什么突然变成了零基础入门教程(一),因为前面那三篇都是基础的不能在基础的教程了.(其实是因为顺序乱了,而且那时候没有单独弄一个专栏,后面我会 ...

最新文章

  1. IT-标准化-系列-0.课程-V1.0
  2. python交互式终端是怎么实现的_python中的脚本和交互式终端客户端
  3. Oracle数据隐式乱码,正则匹配中文数据失败
  4. 控Proxool连接池的活动连接变化情况
  5. IntelliJ IDEA最常用的一些快捷键,学会了室友还以为你在祖安对线
  6. Java学习笔记:创建线程的两种方法
  7. 期货大赛项目|八,ueditor的应用
  8. 3D数学之柏林噪声(Perlin Noise)
  9. 《高性能Linux服务器构建实战Ⅱ》一书纠错汇总(12月30日更新)
  10. java判断枚举是否包含_java判断枚举是否包含
  11. ML/DL-复习笔记【四】- DeepLab系列模型总结
  12. JVM(二):垃圾回收
  13. 中信行业分类判断标准
  14. 算术-几何平均值不等式的常见证明
  15. 企业信息化互联网转型“生死劫”
  16. 伯努利分布、泊松分布
  17. [C#] NAudio 各种常见使用方式 播放 录制 转码 音频可视化
  18. 拦截器、过滤器、监听器
  19. 2022年轨道交通行业研究报告
  20. vue中使用xlsx实现excel表的导入和导出

热门文章

  1. JavaWeb之 HTML概念各类标签详解(上)
  2. Fabric 1.0源代码分析(8)configtx(配置交易) #genesis(系统通道创世区块)
  3. python开发mbus程序_apis-scraper-Python网络刮板获取波兰政党的支持率-TheLastGimbus PL EN...
  4. WPF学习之资源-Resources
  5. 智能网联之TBox、ECall、BCall、ICall是什么?
  6. 科林明伦杯哈尔滨理工大学第六届程序设计团队赛(12.10)
  7. 头文件- boost/thread.hpp标红或者编译报错boost
  8. 装备科研项目的研制阶段过程控制
  9. Python3 + xpath + excel 实现对boss直聘网的爬取
  10. Windows Server 2003 sp1升级到sp2报错解决办法