根据条件过滤文档

时间:2017-07-24 14:38:30

标签: mongodb mongoose filter

以下是我的相关模式:

const UserSchema = new mongoose.Schema({
    name: {
        first: String,
        last: String
    },
    // Each user can have multiple roles
    roles: [{
        type: String,
        enum: ['admin', 'instructor', 'teachingAssistant', 'student']
    }]
});

UserSchema.methods.hasRole = function (role) {
    return this.roles.indexOf(role) > -1;
};

const CourseSchema = new mongoose.Schema({
    name: { type: String, required: true },
    code: { type: String, required: true, unique: 1, uppercase: 1 },
    // Instructors teaching this course
    instructors: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }],
    // TAs teaching this course
    teachingAssistants: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }],
    // Students enrolled in the course
    students: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }],
}); 

在我的管理系统上,我想展示与登录用户的角色相关的课程:

  • 如果用户是管理员,则显示所有课程;
  • 如果用户是讲师,只展示他们作为讲师教学的课程;
  • 如果用户是TA,则只显示他们作为TA教授的课程。

在最后两种情况下,如果用户的用户ID分别位于课程的教师/助教名单中,即course.instructors.indexOf(user._id) > -1或{{1},则用户被视为课程的讲师/助教。 }}

目前,这就是我为登录用户过滤课程的方式,即course.teachingAssistants.indexOf(user._id) > -1

req.user

我想知道是否有办法将过滤转移到查询本身(而不是等待所有结果然后过滤)?

1 个答案:

答案 0 :(得分:0)

你可以,让我们专注于这一部分

models.Course.find().

.find()的第二个参数中,您可以指定要仅提取的字段。

场景1:用户角色= admin

    var options = {};
    models.Course.find({}, options)
    ...