《MongoDB入门教程》第11篇 数组运算符
本文将会介绍 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篇 数组运算符相关推荐
- MongoDB 入门教程实战学习笔记-31-mongo 聚合查询管道 Aggregation Pipieline
aggregation 聚合操作处理数据记录并返回计算结果. 聚合操作将多个文档中的值组合在一起, 并且可以对分组数据执行各种操作以返回单个结果. mongodb 提供了三种执行聚合的方法: 聚合管道 ...
- Systemd 入门教程:实战篇
Systemd 入门教程:实战篇 原文出处: 阮一峰(@ruanyf) http://blog.jobbole.com/98671/?utm_source=blog.jobbole.com& ...
- [Qt教程] 第11篇 2D绘图(一)绘制简单图形
[Qt教程] 第11篇 2D绘图(一)绘制简单图形 楼主 发表于 2013-4-23 12:52:35 | 查看: 1398| 回复: 5 绘制简单图形 版权声明 该文章原创于Qter开源社区,作者 ...
- Linux Capabilities 入门教程--进阶实战篇
该系列文章总共分为三篇: Linux Capabilities 入门教程:概念篇 Linux Capabilities 入门教程:基础实战篇 Linux Capabilities 入门教程:进阶实战篇 ...
- Linux Capabilities 入门教程--基础实战篇
该系列文章总共分为三篇: Linux Capabilities 入门教程:概念篇 Linux Capabilities 入门教程:基础实战篇 Linux Capabilities 入门教程:进阶实战篇 ...
- Systemd入门教程:命令篇
Systemd入门教程:命令篇 转自:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html 作者: 阮一峰 日期: ...
- 深度学习小白入门教程-基础环境篇
深度学习小白入门教程-基础环境篇 如有图片显示失败,请回小主主页查看~ Anaconda 安装包下载方式一:官网(科学上网比较慢,不推荐) 安装包下载方式二:清华镜像(推荐) 具体安装步骤(跟着箭头来 ...
- 九宫怎么排列和使用_广告视频配音剪映零基础入门教程第二十三篇:剪辑之九宫格教程...
朋友圈最火九宫格视频你们知道是怎样制作的吗?我们常常在玩朋友圈的时候想用九宫格照片,但是你们有没有遇到这种情况,想玩九宫格却发现找不到那么多能用的照片,那这时候怎么办呢?玩腻了平常图片的发法,今天我们 ...
- C++零基础入门教程:基础篇(一)
前言 嘿嘿,我叕来啦─=≡Σ(((つ•̀ω•́)つ!别问我为什么突然变成了零基础入门教程(一),因为前面那三篇都是基础的不能在基础的教程了.(其实是因为顺序乱了,而且那时候没有单独弄一个专栏,后面我会 ...
最新文章
- IT-标准化-系列-0.课程-V1.0
- python交互式终端是怎么实现的_python中的脚本和交互式终端客户端
- Oracle数据隐式乱码,正则匹配中文数据失败
- 控Proxool连接池的活动连接变化情况
- IntelliJ IDEA最常用的一些快捷键,学会了室友还以为你在祖安对线
- Java学习笔记:创建线程的两种方法
- 期货大赛项目|八,ueditor的应用
- 3D数学之柏林噪声(Perlin Noise)
- 《高性能Linux服务器构建实战Ⅱ》一书纠错汇总(12月30日更新)
- java判断枚举是否包含_java判断枚举是否包含
- ML/DL-复习笔记【四】- DeepLab系列模型总结
- JVM(二):垃圾回收
- 中信行业分类判断标准
- 算术-几何平均值不等式的常见证明
- 企业信息化互联网转型“生死劫”
- 伯努利分布、泊松分布
- [C#] NAudio 各种常见使用方式 播放 录制 转码 音频可视化
- 拦截器、过滤器、监听器
- 2022年轨道交通行业研究报告
- vue中使用xlsx实现excel表的导入和导出
热门文章
- JavaWeb之 HTML概念各类标签详解(上)
- Fabric 1.0源代码分析(8)configtx(配置交易) #genesis(系统通道创世区块)
- python开发mbus程序_apis-scraper-Python网络刮板获取波兰政党的支持率-TheLastGimbus PL EN...
- WPF学习之资源-Resources
- 智能网联之TBox、ECall、BCall、ICall是什么?
- 科林明伦杯哈尔滨理工大学第六届程序设计团队赛(12.10)
- 头文件- boost/thread.hpp标红或者编译报错boost
- 装备科研项目的研制阶段过程控制
- Python3 + xpath + excel 实现对boss直聘网的爬取
- Windows Server 2003 sp1升级到sp2报错解决办法