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", '小张']
                }
            }
        }
  	} 
 }
]);

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

相关推荐
SimonKing2 分钟前
Spring Boot 动态多数据源:核心思路与关键考量
java·后端·程序员
唐叔在学习5 分钟前
为了不付费,我硬生生用AI开发了一个跨平台待办应用
后端·程序员·ai编程
武子康11 分钟前
大数据-249 离线数仓 - 电商分析 Hive 数仓实战:订单拉链表到 DWS 宽表设计与加载脚本详解
大数据·后端·apache hive
IT_陈寒29 分钟前
用Python爬虫抓了100万条数据后,我总结了这5个反封禁技巧
前端·人工智能·后端
bug攻城狮36 分钟前
SpringBoot 脚手架搭建指南:从零构建企业级开发框架
java·spring boot·后端·架构·系统架构·设计规范
人道领域40 分钟前
【苍穹外卖】深度解析:商品浏览四大核心接口设计(附完整数据流转图)
java·数据库·后端·sql
程序员爱钓鱼41 分钟前
Go静态资源嵌入方案: embed包深度解析
后端·面试·go
AskHarries43 分钟前
独立开发者最浪费时间的10件事
后端·ai编程
猹叉叉(学习版)1 小时前
【ASP.NET CORE】 12. DDD基本概念
笔记·后端·架构·c#·asp.net·.netcore
独断万古他化1 小时前
【抽奖系统开发实战】Spring Boot 项目的奖品模块开发:文件上传、时序设计与奖品创建
java·spring boot·后端·mvc·文件