You need to enable JavaScript to run this app. 如何在MongoDB中使用aggregate查询特定专辑下按分类筛选的歌曲
优惠活动
大模型
产品
解决方案
定价
更多

如何在MongoDB中使用aggregate查询特定专辑下按分类筛选的歌曲

Mongoose aggregate 实现指定专辑+分类筛选歌曲查询

核心实现思路

需求只需要先通过$match阶段筛选出同时匹配指定专辑ID、指定分类ID的歌曲即可,有额外关联查询需求再加对应阶段即可。

完整实现代码

// 先引入你定义的Song模型,路径替换为你自己的文件路径
const Song = require('./models/Song');
const mongoose = require('mongoose');

/**
 * 查询指定专辑下指定分类的歌曲列表
 * @param {String} albumId 目标专辑ID(字符串格式)
 * @param {String} categoryId 目标分类ID(字符串格式)
 * @returns {Array} 符合条件的歌曲列表
 */
async function getFilteredSongs(albumId, categoryId) {
  return await Song.aggregate([
    // 第一阶段:匹配符合条件的歌曲
    {
      $match: {
        // 注意要把字符串ID转成ObjectId才能正确匹配
        albumId: new mongoose.Types.ObjectId(albumId),
        categoryId: new mongoose.Types.ObjectId(categoryId)
      }
    },
    // 【可选】如果需要返回关联的专辑完整信息,加下面的$lookup阶段
    {
      $lookup: {
        from: "albums", // MongoDB中Album对应集合的实际名称,默认是模型名小写加复数
        localField: "albumId",
        foreignField: "_id",
        as: "album"
      }
    },
    // 【可选】如果需要返回关联的分类完整信息,加下面的$lookup阶段
    {
      $lookup: {
        from: "categories", // MongoDB中Category对应集合的实际名称
        localField: "categoryId",
        foreignField: "_id",
        as: "category"
      }
    },
    // 【可选】因为是一对一关联,把lookup返回的数组拆成单个对象
    {
      $unwind: "$album"
    },
    {
      $unwind: "$category"
    }
  ]);
}

注意事项

  • 如果不需要返回关联的分类、专辑信息,直接删掉$lookup和$unwind阶段即可,只保留$match就能拿到符合要求的歌曲列表。
  • 如果你传入的albumId和categoryId本身就是ObjectId类型,可以不用做类型转换。
  • 如果你自己定义模型时指定了集合的自定义名称,$lookup的from字段要替换成你自定义的集合名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 18:21:01