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

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

相关推荐
aircrushin11 分钟前
给宝宝办了个宴,朋友用trae做的工具帮了大忙
前端·后端
码上小翔哥16 分钟前
Jackson 配置深度解析
java·后端
程序员Sunday20 分钟前
爆肝万字!这应该是全网最全的 Codex 实战教程了
前端·后端·ai编程
aircrushin21 分钟前
朋友用trae搭建的工具,解决了旅行拍照共享的大事儿
前端·后端
星栈21 分钟前
把业务逻辑写成纯函数之后,我再也不想写 Service 层了
后端·开源
未秃头的程序猿22 分钟前
如何用 AI 写出符合规范的 Java 代码?我总结了 7 条有效建议
java·后端·ai编程
阿聪谈架构23 分钟前
第10章:Agent 记忆系统 —— 让 AI 真正"记住"你
人工智能·后端
木雷坞25 分钟前
我把 AI Coding Agent 的 MCP 工具链放进容器里跑了一遍
后端
jfqqqqq32 分钟前
记一次ubuntu 22.04安装旧版 MongoDB 4.2
linux·mongodb·ubuntu
BING_Algorithm32 分钟前
开发常用Linux命令
linux·后端