首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于条件过滤文档

基于条件过滤文档
EN

Stack Overflow用户
提问于 2017-07-24 14:38:30
回答 1查看 42关注 0票数 0

以下是我的相关模式:

代码语言:javascript
复制
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' }],
}); 

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

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

在最后两种情况下,如果用户ID在课程的讲师/助教列表中,即course.instructors.indexOf(user._id) > -1course.teachingAssistants.indexOf(user._id) > -1,则用户被视为课程的指导员/助教。

目前,我是如何为登录用户(即req.user )筛选课程的。

代码语言:javascript
复制
exports.getCourses = (req, res) => {
    models.Course.find().sort('code').lean().exec((err, courses) => {
        res.render('admin/pages/courses', {
            bodyClass: 'courses',
            title: 'Courses',
            courses: _.filter(courses,  course => {
                return req.user.hasRole('admin') ||
                    course.instructors.indexOf(req.user.id) !== -1 ||
                    course.teachingAssistants.indexOf(req.user.id) !== -1;
            }) 
        });
    });
};

我想知道是否有一种方法可以将过滤移到查询本身(而不是等待所有结果,然后进行筛选)?

EN

回答 1

Stack Overflow用户

发布于 2017-07-24 15:52:11

可以,让我们关注这一节。

代码语言:javascript
复制
models.Course.find().

.find()的第二个参数中,可以指定只想获取哪些字段。

场景1:用户角色=管理

代码语言:javascript
复制
    var options = {};
    models.Course.find({}, options)
    ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45283405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档