在expressjs中构建管理面板,在不查询的情况下统计用户的最佳方法是什么?

时间:2014-01-03 23:06:49

标签: node.js mongodb caching express

所以我正在为我的应用构建一个管理面板。在admin的主页上,我想显示一些有关用法的统计信息。

示例:24小时,7天,30天,所有时间注册 注册方法:user / pass,facebook,twitter等

现在在我的admin.index路由器中,我正在对我的数据库进行异步调用(mongodb使用mongoose)以获取所有计数,并在最终回调函数中呈现页面。

exports.index = function(req, res){
    async.parallel({ 
            // https://github.com/caolan/async#parallel
            // counts number of users in date ranges
            all_time: function(next) {
                console.log('querying');
                User.count({}, function (err, count) {
                    if (err) return next(err);
                    next(null, count);
                });
            },
            past_day: function(next) {
                console.log('querying');
                User.count({'created_at': {$gte: yesterday}}, function(err, count) {
                    if (err) return next(err);
                    next(null, count);
                });
            },
            week: function(next) {
                console.log('querying');
                User.count({'created_at': {$gte: week}}, function(err, count) {
                    if (err) return next(err);
                    next(null, count);
                });
            },
            month: function(next) {
                console.log('querying');
                User.count({'created_at': {$gte: month}}, function(err, count) {
                    if (err) return next(err);
                    next(null, count);
                });
            },
            // Counts number of user signups for each strategy
            local: function(next) {
                console.log('querying');
                User.count({'strategy': 'local'}, function(err, count) {
                    if (err) return next(err);
                    next(null, count);
                });
            },
            google: function(next) {
                console.log('querying');
                User.count({'strategy': 'google'}, function(err, count) {
                    if (err) return next(err);
                    next(null, count);
                });
            },
            facebook: function(next) {
                console.log('querying');
                User.count({'strategy': 'facebook'}, function(err, count) {
                    if (err) return next(err);
                    next(null, count);
                });
            },
            twitter: function(next) {
                console.log('querying');
                User.count({'strategy': 'twitter'}, function(err, count) {
                    if (err) return next(err);
                    next(null, count);
                });
            }
        }, 
        function(err, r) {
            if (err) throw err;
            res.render('admin/index', {
                appName: Constants.APP_NAME, 
                title: 'Admin',
                total_users: r.all_time,
                yesterday: r.past_day,
                week: r.week,
                month: r.month,
                local: r.local,
                google: r.google,
                facebook: r.facebook,
                twitter: r.twitter
            })
        }
    );
}

但就像现在一样,我正在对每个页面加载进行计算(8次查询)。有什么更好的方法呢?我从来没有构建过CRUD应用程序,所以不太了解。我没有使用express和node的经验,因此不太了解它在这里是如何工作的。

我应该使用memcached,还是过度杀伤?如何使用异步?

1 个答案:

答案 0 :(得分:1)

首先,最好尽可能优化,看看$or operator。 也许您可以只使用一个请求,具体取决于您的数据结构。 如果不能,您可以制作仅包含计数的文档,查询此文档,并在一个小请求中获得所有计数。

但我认为这里的优化不是必需的。这些查询适用于管理员。想象一下,您的1个管理员和1万个用户已连接到您的网站,这些查询不是针对您的,仅针对您,您有时会使用;影响是微不足道的。

此外,您的查询会受益于asynchrone,因此您的应用可以在同一时间响应其他用户。