Mongoose中Course.aggregate is not a function错误排查求助
问题排查与修复方案
1. 语法错误(直接触发报错)
第一个lookup配置的localField字段里多了冗余的,Course,属于语法错误,会直接导致代码解析失败:
// 错误写法 localField: 'user',Course, // 正确写法 localField: 'user',
2. 集合名称不匹配问题
Mongoose默认会把模型名转换为小写复数形式作为集合名称:
User模型对应的集合默认是users,不是UserEnrolledCourses模型对应的集合默认是enrolledcourses(如果定义模型时没手动指定collection选项)
因此lookup的from参数要改成对应集合的实际名称:
.lookup({ from: 'users', // 替换原有的'User' localField: 'user', foreignField: '_id', as: 'user' }) .lookup({ from: 'enrolledcourses', // 替换原有的'EnrolledCourses',若模型指定了集合名则用指定值 localField: '_id', foreignField: 'course', as: 'enrolled_courses' })
3. 排序字段不存在问题
你的Course Schema里既没定义createdAt字段,也没开启timestamps自动生成该字段,所以sort({ createdAt: -1 })会因找不到字段触发异常。
如果需要按创建时间排序,有两种解决方式:
- 在Schema中添加
timestamps选项,自动生成createdAt和updatedAt:const CourseSchema = new Schema({ // ... 原有字段 }, { timestamps: true }); - 改用
_id排序(MongoDB的ObjectId自带时间戳信息):.sort({ _id: -1 })
修复后的完整查询代码
const courses = await Course.aggregate() .lookup({ from: 'users', localField: 'user', foreignField: '_id', as: 'user' }) .lookup({ from: 'enrolledcourses', localField: '_id', foreignField: 'course', as: 'enrolled_courses' }) .limit(parseInt(req.query.limit) || 10) // 建议转成数字类型,避免字符串引发异常 .sort({ _id: -1 }) // 若开启了timestamps可替换为{ createdAt: -1 } .exec()
内容的提问来源于stack exchange,提问作者kittu
相关产品推荐
相关产品推荐

