当前位置: 首页 > news >正文

《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 ] }
]

相关文章:

  • java Python+Django的大学生提问论坛系统-在线答疑系统
  • Vue学习第18天——Vue中的过度与动画效果的使用与案例
  • 设计模式 单一职责原则、开放封闭原则、依赖倒置原则、里氏代换原则
  • Codeforces Round #816 (Div. 2)补题(A-E)
  • 【牛客网-公司真题-前端入门篇】——百度2021校招Web前端研发工程师笔试卷(第二批)
  • 【Android应用与开发】DAY1-安装Android Studio报错整合及学习
  • Mybatis实战练习六【批量删除Mybatis参数传递】
  • 小白量化《穿云箭集群量化》(1)小白草根超级量化软件介绍
  • C语言指针操作(七)*指针数组和多重指针
  • 【python经验总结】我与bug的那些日子
  • <栈和队列及模拟实现>——《Data Structure in C Train》
  • 猿创征文|【Typescript】搭建TS的编译环境
  • 【项目管理】beautyeye
  • Connor学Android - HandlerThread和IntentService
  • Github每日精选(第31期):macOS 下的亮度和音量调节MonitorControl
  • es的写入过程
  • go append函数以及写入
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Linux快速复制或删除大量小文件
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 彻底搞懂浏览器Event-loop
  • 大整数乘法-表格法
  • 多线程 start 和 run 方法到底有什么区别?
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 浅谈Golang中select的用法
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • Android开发者必备:推荐一款助力开发的开源APP
  • #Linux(make工具和makefile文件以及makefile语法)
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (2020)Java后端开发----(面试题和笔试题)
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (分类)KNN算法- 参数调优
  • (分享)自己整理的一些简单awk实用语句
  • (七)Java对象在Hibernate持久化层的状态
  • (强烈推荐)移动端音视频从零到上手(上)
  • (三十五)大数据实战——Superset可视化平台搭建
  • (四) Graphivz 颜色选择
  • (转载)PyTorch代码规范最佳实践和样式指南
  • (轉貼) UML中文FAQ (OO) (UML)
  • .net CHARTING图表控件下载地址
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .net 微服务 服务保护 自动重试 Polly
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NetCore部署微服务(二)
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @Autowired标签与 @Resource标签 的区别
  • @DataRedisTest测试redis从未如此丝滑
  • @ModelAttribute注解使用
  • @SuppressWarnings注解
  • [AIGC codze] Kafka 的 rebalance 机制
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [C puzzle book] types
  • [EFI]Lenovo ThinkPad X280电脑 Hackintosh 黑苹果引导文件
  • [English]英语积累本
  • [HeadFrist-HTMLCSS学习笔记][第一章Web语言:开始了解HTML]