Mongoose限制/允许的文件

时间:2014-09-30 15:30:23

标签: node.js mongoose underscore.js lodash

我有一个程序架构,如下所示:

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更好的解决方案吗?就像使用mongoose方法并在返回之前过滤文档一样?


解决方案

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 个答案:

答案 0 :(得分:1)

为什么不查询your_user_id数组中的user.allowed

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