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

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

相关推荐
树獭叔叔13 小时前
Claude Code Skill 系统:懒加载的 Agent 行动说明
后端·aigc·openai
Nexzk14 小时前
我把 Hermes Agent 源码扒了个底朝天:它不是“又一个 AI Agent”,而是在认真造一套代理操作系统
后端
袋鱼不重14 小时前
Hermes Agent 安装与实战:从安装到与 OpenClaw 全方位对比
前端·后端·ai编程
写Cpp的小黑黑14 小时前
C++ std::shared_ptr 线程安全性和最佳实践详解
后端
沸点小助手14 小时前
「 AI 整活大赛,正式开擂 & 最近一次面试被问麻了吗」沸点获奖名单公示|本周互动话题上新🎊
前端·人工智能·后端
何陋轩14 小时前
消息队列Kafka与RabbitMQ深度解析:把分布式消息核心讲透,吊打面试官
redis·后端
青Cheng序员石头14 小时前
龙虾运行时安全部署 | NVIDIA NemoClaw 深度研究报告
后端·aigc·nvidia
Oneslide14 小时前
解决 df -h 与 lsblk 显示不一致问题(XFS 文件系统实操记录)
后端
_Evan_Yao14 小时前
别让“规范”困住你:前后端交互中的方法选择与认知突围
java·后端·交互·restful
成为大佬先秃头15 小时前
开放标准(RFC 7519):JSON Web Token (JWT)
spring boot·后端·json·jwt