基于相关表的猫鼬过滤器

时间:2014-06-08 05:14:20

标签: node.js mongoose

我开发了一个包含2个表角色和用户的简单模式。 users表引用角色表。

我想选择所有具有特定角色的用户。

为此,我编写了这段代码

models.js

var RoleSchema = new mongoose.Schema({
    rolename : {type: String, required: true}
});
var RoleModel = db.model('Role', RoleSchema, 'Role');

var UserSchema = new mongoose.Schema({
    username : {type: String, required: true},
    email : {type: String, required: true},
    role : {type: mongoose.Schema.Types.ObjectId, ref: 'Role', required: true}
});
var UserModel = db.model('User', UserSchema, 'User');
module.exports = {Role: RoleModel, User: UserModel};

app.js

var models = require('../models.js);

var rolename = req.params.rolename;
logger.info('came inside getUserByRole ' + rolename);
models.User 
.where('role.rolename').equals(rolename)    
.exec(function(err, users){
    if (err) res.json(501, 'Internal Error');
    if (users == null) res.json(404, 'No users found');
    res.json(200, users);
});

但是这段代码会返回所有用户。我希望用户列表将按我指定的角色名称进行过滤。

我也试过

exports.getUsersByRole = function(req, res) {   
    var rolename = req.params.rolename;
    logger.info('came inside getUserByRole ' + rolename);
    models.User 
    .find({})
    .populate({
        path: 'role',
        match: {'role.rolename': rolename}
    })
    .exec(function(err, users){
        if (err) res.json(501, 'Internal Error');
        if (users == null) res.json(404, 'No users found');
        res.json(200, users);
    });
};

但是这也会返回所有用户(并且角色为null)。不会过滤角色名,也不会填充角色名。

1 个答案:

答案 0 :(得分:2)

由于role是参考,因此您需要populate,因为您已在第二次尝试中完成。但是在查询完成之前不会发生此populate,因此您需要在初始查询(similar to this answer)之后进行过滤。

所以在你的场景中,有这样的事情:

models.User.find().populate("role").exec(function(err, users) {
    users = users.filter(function(user) {
        return user.role.rolename === req.params.rolename;
    });

    res.send(users);
});