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

