【问题标题】:Joining records in mongodb with node.js使用 node.js 在 mongodb 中加入记录
【发布时间】:2014-04-06 01:23:38
【问题描述】:

我在我的项目中使用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. 输出用户数组。

以下是我的实现方法。

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

谁能推荐一个更好的解决方案?谢谢!

【问题讨论】:

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


    【解决方案1】:

    您有两个选择可以让您的代码更高效:如果您还没有升级到 Sails v0.10,并使用内置的关联功能,或者使用 Mongo 中的嵌入式文档。如果您选择选项一,您的模型将如下所示:

    用户属性

    {
        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 中使用嵌入式文档,只需将 permissions: 'array' 属性添加到 User.js 即可将现有的 permission 模型合并到 user 中。考虑到您现在设置它的方式,每个 User 实例最多有一个链接的 Permission 实例,实际上没有理由将它们作为两个单独的模型。选项一的唯一真正好处是能够独立于用户查询权限,即询问“哪些用户拥有某某权限”或“有多少用户拥有高于 x 级的权限”之类的问题?如果这些问题与您的应用无关,则没有理由将 permission 保留为单独的模型。

    【讨论】:

    • 这个真的好用!!!非常感谢您的信息!只是好奇你知道 Sails 0.10 什么时候会正式发布?
    猜你喜欢
    • 2018-11-30
    • 2020-08-10
    • 2012-10-17
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多