You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB嵌套文档查询需求:筛选approved为true的photos并保留所有文档

解决MongoDB过滤数组元素同时保留所有文档的问题

嘿,我完全懂你现在的困扰——你想要查询集合里的所有文档,对于包含photos字段的文档,只保留其中approved属性为true的元素,同时还得确保那些没有photos字段的文档也完整保留下来。之前用unwind确实容易出问题,因为它会把没有数组的文档排除掉,或者处理起来很繁琐,不过用聚合框架里的$filter就能轻松搞定这个需求!

解决方案思路

核心就是用$project阶段结合$filter和$ifNull操作符:

  • $ifNull:用来处理没有photos字段的文档,把它转换成空数组,避免$filter报错;
  • $filter:遍历photos数组,只筛选出approved等于true的元素;
  • 保留原文档的其他字段(比如_id、name),确保所有文档都被保留。

完整聚合查询代码

db.yourCollectionName.aggregate([
  {
    $project: {
      name: 1, // 保留name字段
      photos: {
        $filter: {
          input: { $ifNull: ["$photos", []] }, // 若photos不存在则设为空数组
          cond: { $eq: ["$$this.approved", true] } // 筛选approved为true的元素
        }
      }
    }
  }
])

结果验证

运行这个查询后,你会得到符合预期的结果:

  • 第一个文档的photos数组只会包含approved: true的元素;
  • 第二个没有photos字段的文档会完整保留,photos字段会显示为空数组(如果你想让它完全不显示photos字段,可以调整$project的逻辑,不过保留空数组更贴合你需求里的结构)。

如果之后需要筛选approved: false的元素,只要把cond里的true改成false就行,完全可以按需调整。

内容的提问来源于stack exchange,提问作者Tobias Guimarães

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:44:58