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

MongoDB聚合$match无查询条件返回空数组的解决方法

解决MongoDB聚合管道无查询条件时返回全部数据的问题

核心思路是动态构建聚合管道的$match阶段:只有当查询参数存在且有效时,才添加对应的匹配条件;参数不存在时跳过该$match阶段,这样就能返回全部数据,而参数不匹配时自然返回空数组。

修改后的代码如下:

export const getMovies = async (req, res) => {
  const actorname = req.query.name
  const genrename = req.query.genre

  // 初始化聚合管道的固定阶段
  const pipeline = [
    { $addFields: { genre: '$genres' } },
    { $unwind: "$genre" },
    {
      $group: {
        _id: '$genre',
        movieCount: { $sum: 1 },
        movies: {
          $push: {
            movie: "$movie",
            genre: "$genres",
            name: "$name",
            rating: "$rating"
          }
        }
      }
    },
    { $addFields: { genre: '$_id' } },
    { $project: { _id: 0 } }
  ]

  // 动态添加针对actorname的$match阶段(仅当参数存在时)
  if (actorname) {
    // 将actorname的匹配阶段插入到unwind之前,减少无效数据处理
    pipeline.splice(1, 0, { $match: { name: actorname } })
  }

  // 动态添加针对genrename的$match阶段(仅当参数存在时)
  if (genrename) {
    pipeline.push({ $match: { genre: genrename } })
  }

  const movies = await Movie.aggregate(pipeline)
  res.status(200).json({ movies })
}

关键改动说明:

  • 动态构建管道:把固定的聚合阶段先提取出来,再根据参数是否存在,动态插入或追加对应的$match阶段。
  • 性能优化:针对actorname的$match被放到$unwind之前,先过滤掉不符合条件的文档,减少后续unwind和group的处理量。
  • 逻辑匹配需求:只有当actorname或genrename存在(非空、非undefined)时,才添加匹配条件。参数不存在时跳过$match,返回全部数据;参数存在但无匹配文档时,返回空数组。

内容的提问来源于stack exchange,提问作者kishore kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:50:20