我开发了一个包含2个表角色和用户的简单模式。 users表引用角色表。
我想选择所有具有特定角色的用户。
为此,我编写了这段代码
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};
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)。不会过滤角色名,也不会填充角色名。
答案 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);
});