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

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

相关推荐
高频因子挖掘机19 分钟前
量化回测前的数据审计:如何判断股票历史行情是否缺失、重复或存在偏差
后端·github·api
mldong25 分钟前
审批流程图上那些亮着的线,数据库里一条都没存:jeeflow 工作流引擎的高亮是重算出来的
后端·架构
geovindu29 分钟前
rust: Borg Pattern(续)
开发语言·后端·设计模式·rust·博格模式
苍何9 小时前
开源微信流 Windows,微信聊天记录,可以直接给 Codex 和 Obsidan 了
后端
代码什么用10 小时前
Spring基础使用
java·后端·spring
明月_清风11 小时前
Deno 终局来了:从挑战 Node 到被 Cloudflare 收编
前端·后端·node.js
蜗牛互联网11 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端
用户693717500138413 小时前
2026,程序员的时代拐点到了
android·前端·后端
惜鸟14 小时前
从源码看 pi 的上下文管理:原始数据永久保留,模型视角按需裁剪
后端
量化分析码农14 小时前
【Python量化策略评估体系 #05】极端行情扛得住吗?2008/2015/2020 三场景压力测试
后端