Mongodb 过滤数组匹配到的元素

好久没写后端代码了,聚合查询已然生疏,遇到个问题竟然翻了好久文档才解决,以前遇到过,就是没有记录下来,这次留个底 🙃

场景

有类似于这样一个场景:

假设有一张表:tasks,有以下数据:

javascript 复制代码
[
  { 
  	_id: 1,
  	participants: [
    	{ name: '小张', age: 30 },
    	{ name: '小李', age: 32 }, 
    	{ name: '小张', age: 20 }
    ]
  },
  ...
]

预期结果是 :

javascript 复制代码
[
  { 
    _id: 1, 
    participants: [
      { name: '小张', age: 30 },
      { name: '小张', age: 20 }
    ]
  }
]

有同学可能会想到, db.tasks.find({_id: 1, "participants.name": '小张'}); 这种是不是就解决了呢?有这样的猜测没有什么毛病,不过老道的玩家是知道这样不行的,因为这个只能匹配到数组中符合条件的这一整条数据,但是不能过滤数组中仅满足条件的元素,结果是这样的:

yaml 复制代码
  [{ 
  	_id: 1,
  	participants: [
    	{ name: '小张', age: 30 },
    	{ name: '小李', age: 32 }, 
    	{ name: '小张', age: 20 }
    ]
  }]

解决办法

使用聚合查询的 $project 加数组的 $filter 操作符过滤,示例如下:

javascript 复制代码
db.tasks.aggregate([
  { $match: { _id: 1 } },
  { 
    $project: {
      	_id: 1,
  		participants: {
        	$filter: {
            	input: "$participants",
              	as: "result",
              	cond: {
                    $eq: ["$$result.name", '小张']
                }
            }
        }
  	} 
 }
]);

对你有用的话,来波素质三连哟 🌹

相关推荐
计算机学姐7 分钟前
基于SpringBoot的社区互助系统
java·spring boot·后端·mysql·spring·信息可视化·推荐算法
源代码•宸12 分钟前
Leetcode—3314. 构造最小位运算数组 I【简单】
开发语言·后端·算法·leetcode·面试·golang·位运算
Java程序员威哥20 分钟前
SpringBoot4.0+JDK25+GraalVM:云原生Java的性能革命与落地指南
java·开发语言·后端·python·云原生·c#
无心水42 分钟前
1、Go语言工作区和GOPATH实战指南:从项目初始化到部署
开发语言·后端·架构·golang·go·gopath·go mod init
高山上有一只小老虎43 分钟前
JPA实现分页查询
java·spring boot·后端
Java程序员威哥1 小时前
【包教包会】SpringBoot依赖Jar指定位置打包:配置+原理+避坑全解析
java·开发语言·spring boot·后端·python·微服务·jar
Python少年班1 小时前
MySQL MongoDB Redis官方本地百度网盘下载链接
redis·mysql·mongodb
Java程序员威哥1 小时前
Spring AI快速上手:Java集成ChatGPT/文心一言,30分钟实现智能问答接口
java·人工智能·spring boot·后端·python·spring·云原生
木风小助理1 小时前
QPS监控:SpringBoot应用性能监控的必要性与实践
java·spring boot·后端
qq_12498707532 小时前
基于Spring Boot的心理咨询预约微信小程序(源码+论文+部署+安装)
java·spring boot·后端·spring·微信小程序·小程序·毕业设计