2014-09-30 65 views
0

我有一個程序架構,看起來像這樣:貓鼬限制/允許文件

var ProgramSchema = new Schema({ 
    active: { type: Boolean, default: false }, 
    name: { type: String, required: true }, 
    ... 
    user: { 
    ... 
    allowed: [{ 
     type: Schema.Types.ObjectId, 
     ref: 'User' 
    }], 
    restricted: [{ 
     type: Schema.Types.ObjectId, 
     ref: 'User' 
    }] 
    } 
}); 

如果允許不爲空,並從登錄的用戶的User._id不是它,我不不想給他看文件。

如果受限制不是空的,並且來自登錄用戶的User._id在其中,我不想讓他看到文檔。

我的第一個想法是,當我通過Program.find()獲取所有文檔時,我循環遍歷每個文檔並檢查文檔是否應該返回。

但是沒有比使用forEach更好的解決方案嗎?就像使用貓鼬方法並在返回之前過濾文檔一樣?


解決方案

var query = { 
'active': true, //shows only active programs 
$or: [{ 'user.allowed': {$size: 0} }, { 'user.allowed': req.user._id }], //true if allowed is empty or has userId in it 
'user.restricted': { $ne: req.user._id } //true if restricted doesn't contain userId 
}; 

Program.find(query, 'name owner image categories user special', function (err, p) { 
    if(err) { return handleError(res, err); } 
}) 
.sort({_id: -1}) 
.exec(function(err, programs){ 
    if(err) { return handleError(res, err); } 
    res.json(200, programs); 
}); 

回答

1

爲什麼user.allowed數組中沒有查詢your_user_id

db.programs.find({'user.allowed': 'your_user_id'});