我在我的项目中使用sails。我有两个模型,用户和权限。
user
{
c_name: 'string',
e_name: 'string'
}
permission
user: {
type: 'string',
required: true,
unique: true
},
permissions: {
type: 'array'
}
我希望使用user.id
查找具有相应权限的所有用户。但是因为我使用的是mongodb而不是关系数据库,所以我无法使用SQL加入。因此,以下是我在想的步骤:
以下是我实现它的方法。
我正在使用node.async对我的通话进行排队。
UserController.js
var async = require('async'); // using node.async
module.exports = {
find: function (req, res){
async.auto({
getUsers: function(callback){
User.find().done(function(err, users){
callback(err, users);
});
},
getPermission: ['getUsers', function(callback, users){
async.each(users.getUsers, function (user, cb){
Permission.findOne({'user': user.id}).done(function (err, permission){
if (permission)
user.permissions = permission.permissions;
cb();
});
}, function(err){
callback(users);
});
}]
}, function(err, results) {
// console.log(results);
res.send(results.getUsers);
});
}
}
有人可以提出更好的解决方案吗?谢谢!
答案 0 :(得分:0)
这里有两个选择可以提高您的代码效率:如果您还没有升级到Sails v0.10,并使用内置的关联功能,或者在Mongo中使用嵌入式文档。如果你选择选项1,你的模型看起来会像:
用户属性:
{
c_name: 'string',
e_name: 'string',
permissions: {
collection: 'permission',
via: 'user'
}
}
权限属性:
{
permission: 'string', // or whatever
user: {
model: 'user'
}
}
然后,您可以使用myUser.permissions.add(permissionId)
后跟myUser.save(function(err, savedUser){...})
或通过创建/更新permission
实例并将user
属性设置为用户来为用户实例添加权限ID。要检索具有权限的用户,您可以执行User.find(criteria).populate('permissions').exec(...)
。
您可以使用npm install sails@beta
安装Sails v0.10。文档位于http://beta.sailsjs.org,但它们可能会发生变化。
要在Mongo with Sails中使用嵌入式文档,只需在permission
中添加user
属性,即可将现有的permissions: 'array'
模型合并到User.js
。考虑到你现在设置它的方式,每个User实例最多只有一个链接的Permission实例,实际上没有理由将它们作为两个单独的模型。选项一的唯一真正好处是能够查询与用户分离的权限,即提出诸如"哪些用户具有某某权限等问题的问题。或者"有多少用户拥有超过x"的权限?如果这些问题与您的应用无关,则没有理由将permission
作为单独的模型。