2015-11-19 6 views
0

Мне нужно проверить, имеет ли пользователь данный идентификатор, проект с указанным идентификатором и роль с заданным именем.mongoose query .where/.and after .populate

var UserSchema = new Schema({ 
    roles: [{ 
      project: { 
        type: mongoose.Schema.Types.ObjectId, 
        ref: 'Project', 
      }, 
      role: { 
        type: mongoose.Schema.Types.ObjectId, 
        ref: 'Role', 
      } 
    }] 
}); 

и

var RoleSchema = new Schema({ 
    name: { 
      type: String 
    } 
}); 

I судимого к .populate, а затем применить .где, но .гд ничего не делает.
Использование .and после заполнения также не работает.

Как решить это в mongodb/mongoose?

Спасибо!

// EDIT Сейчас у меня есть что-то подобное, что не работает (.где ничего не делает), и это действительно не красиво:

User.findById(userId) 
    .populate({ 
     path: 'roles.role', 
     match: { 'name': roleName} 
    }) 
    .where('roles.project').equals(projectId) 
    .exec(function(err, data){ 
     data.roles = data.roles.filter(function(f){ 
      return f.role; 
     }) 
     if(!err){ 
      if(data){ 
       if(data.roles.length == 1) { 
        return true; 
       } 
      } 
     } 
     return false; 
    }); 

Когда я делать то, что сказал Кевин B:

Role.findOne({name: roleName}, function(err, data){ 
    if(!err){ 
     if(data){ 
      User.findById(userId) 
       .and([ 
        {'roles.project': projectId}, 
        {'roles.role': data._id} 
       ]) 
       .exec(function(err2, data2){ 
        if(!err2){ 
         if(data2){ 
          console.log(data2); 
         } 
        } 
      }); 
     } 
    } 
}); 

запроса й просто ничего не делает здесь ...

+0

Покажите нам свой запрос ... даже не рабочий код здесь имеет значение. –

+0

В этом случае вы должны сначала ** запросить коллекцию ролей для ролей с заданным именем, тогда вам придется запрашивать пользователей, которые упомянули роли и проекты по идентификатору. –

ответ

0

Сейчас я просто делаю сравнение в программе вместо базы данных.

User.findById(userId) 
.populate('roles.role') 
.exec(function(err, data){ 
    if(!err){ 
     if(data){ 
      if(data.roles.find(function(element, index, array){ 
       return element.project == projectId && element.role.name == roleName; 
      })) 
       return callback(true); 
     } 
    } 
    return callback(false); 
});