mongo对文档中数组进行过滤的三种方法
1|0前言
在mongo中数据类型有很多种,常见的包括:
数据类型 | 例子 | 描述 |
---|---|---|
String | { "x" : "foot" } |
字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | { "x" : 1 } |
整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Object | { "x" : { "y" : "foot" } } |
用于内嵌文档 |
Array | { "x" : [ "a" , "b" ] } |
用于将数组或列表或多个值存储为一个键。 |
有一种很常见的查询,就是过滤数组中的一些数据,只返回符合要求的数据。数据如下,将下面travel中的vehicle=train的记录保留,过滤掉其他的元素,并返回整个文档。
想要实现数组的过滤有三种方法,包括:
- 聚合查询 使用
$unwind
将travel
数组打散,获取结果集后用$match
筛选符合条件的数据,最后使用$group
进行聚合获取最终结果集 - 聚合查询 使用
$match
过滤符合条件的根文档结果集,然后使用$projec
t返回对应字段的同时,在travel
数组中使用$filter
进行内部过滤,返回最终结果集 - 普通查询 先筛选记录,然后通过投影查询过滤数组
下面来分析这三种方法能否实现需求。
2|0添加数据
假设有两条记录,每条记录是一个人的信息,包括姓名、职业、旅游过的城市。旅游过的城市是一个数组,包含城市的名字以及交通工具。
3|0验证三种方法
3|1需求说明
现在的目标是:筛选的出所有记录中通过火车去旅游的城市,也就是travel数组中vehicle=train的记录,过滤掉非目标记录。
3|2方法一
方法一:使用$unwind
将travel
数组打散,获取结果集后用match
筛选符合条件的数据,最后使用$group
进行聚合获取最终结果集。
结果:
分析:
unwind 可以将一个数组拆分,例如unwind的效果如下:
然后通过match筛选出符合条件的数据
最后通过group进行聚合,以_id为聚合依赖,合并相同_id的数据。
总结:
这种方法是能够达到过滤数组的要求,但是有一个问题,拆分数组比较简单,想要再合并起来就不容易了。group只能以某一个变量为基准聚合,其他变量都会丢失。比如最后的结果只保留了_id和travel,其他变量都丢失了。
3|3方法二
方法二:使用$match
过滤符合条件的根文档结果集,然后使用$project
返回对应字段的同时,在travel
数组中使用$filter
进行内部过滤,返回最终结果集
结果分析:
分析:
mongo中查询分为两种:普通查询和高级查询。高级查询包括聚合查询,用aggregate关键字实现。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
这里我们介绍一下聚合框架中常用的几个操作:
$project
:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。$match
:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。$limit
:用来限制MongoDB聚合管道返回的文档数。$skip
:在聚合管道中跳过指定数量的文档,并返回余下的文档。$unwind
:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。$group
:将集合中的文档分组,可用于统计结果。$sort
:将输入文档排序后输出。$geoNear
:输出接近某一地理位置的有序文档。
这里首先使用match过滤所有job=coder,然后使用project修改输出的结构。在project中使用了filter来过滤数组中的元素。
filter的定义如下:
根据指定条件选择要返回的数组的子集。返回仅包含与条件匹配的那些元素的数组。返回的元素按原始顺序。
$filter
具有以下语法:
领域 | 规格 |
---|---|
input | 解析为数组的表达式。 |
as | 可选的。代表数组中每个单独元素的变量名称input。如果未指定名称,则变量名称默认为this |
cond | 该表达式可解析为布尔值,该布尔值用于确定输出数组中是否应包含元素。该表达式input使用在中指定的变量名称分别引用数组的每个元素as。 |
https://mongodb.net.cn/manual/reference/operator/aggregation/filter/
在cond将vehicle=train的元素留下,排除其他元素。
总结:
这种方法可以完成查询目标,既可以过滤掉数组中的元素,也可以返回完整的文档。
3|4方法三
方法三:
通过投影查询,先选择符合条件的记录,在通过使用投影操作符,需要返回的字段,以及排除特定的字段。
结果:
分析:
什么是投影查询?
在MongoDB中,投影查询是一种查询操作,用于选择性地返回文档中的字段。通过使用投影操作符,我们可以指定需要返回的字段,以及是否要排除特定的字段。
投影查询语法如下所示:
其中,
在projection中保留字段、排除字段、选择或排除数组中的特定元素。利用选择或排除数组中的特定元素的特性也可以达到目的。
例如:
如果我们只想返回每个文档中的第一个标签,我们可以这样做:
在本篇中通过filter方法来过滤数组,保留符合条件的元素。
总结:
该方法能够完成查询目标,并且是一种简洁的实现,普通查询复杂度低,而且没有太多关键字的使用。
参考文档
:
https://geek-docs.com/mongodb/mongodb-questions/393_mongodb_mongo_query_with_projection.html
https://segmentfault.com/a/1190000016629733
https://mongodb.net.cn/manual/reference/operator/aggregation/filter/
https://blog.csdn.net/weixin_44009447/article/details/115479348
__EOF__

本文链接:https://www.cnblogs.com/goldsunshine/p/18460043.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!