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
相关产品推荐
相关产品推荐

