2017-07-24 134 views
0

以下是我的相關模式:過濾單據的條件

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的課程。

在後兩種情況下,用戶被認爲是一個講師/課程的TA,如果他們的用戶ID是在指導員/ TAS的過程的列表,即分別course.instructors.indexOf(user._id) > -1course.teachingAssistants.indexOf(user._id) > -1

目前,這是怎麼了濾波的課程已登錄的用戶即req.user

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; 
      }) 
     }); 
    }); 
}; 

我想知道是否有移動過濾進入查詢本身(而不是等待的方式所有的結果,然後過濾)?

回答

0

就可以了,讓專注於這部分

models.Course.find(). 

.find的第二個參數(),您可以指定只希望獲取哪些字段。

方案1:用戶角色=管理

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

謝謝,但我不認爲這會幫助我。我不是試圖包含/排除字段,而是使用一個查詢來包含/排除文檔。 – Mikey

+0

然後做第一個參數,然後 –