将mongodb中的记录与node.js连接起来

时间:2014-04-06 01:23:39

标签: node.js mongodb join asynchronous sails.js

我在我的项目中使用sails。我有两个模型,用户和权限。

user

{
     c_name: 'string',
     e_name: 'string'
}

permission

user: {
    type: 'string',
    required: true,
    unique: true
},

permissions: {
    type: 'array'
}

我希望使用user.id查找具有相应权限的所有用户。但是因为我使用的是mongodb而不是关系数据库,所以我无法使用SQL加入。因此,以下是我在想的步骤:

  1. 获取所有用户
  2. 循环用户
  3. 为每个用户找到他们的许可
  4. 向用户添加权限
  5. 输出用户数组。
  6. 以下是我实现它的方法。

    我正在使用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);
        });
       }
    }
    

    有人可以提出更好的解决方案吗?谢谢!

1 个答案:

答案 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作为单独的模型。