在expressjs构buildpipe理面板,计数用户没有查询很多的最佳方式?

所以我正在为我的应用程序构build一个pipe理面板。 在pipe理员的主页上,我想显示一些关于使用情况的统计信息。

例如:24小时,7天,30天注册,所有时间注册方法:用户/密码,脸谱,微博等

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

 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个查询)。 什么是更好的方法来做到这一点? 我从来没有build立CRUD应用程序,所以不知道多less。 我没有快递和节点的经验,所以不知道在这里如何工作。

我应该使用memcached,还是这是一个矫枉过正的? 这将如何与asynchronous工作?

首先,尽可能优化,看看$或者操作符 。 也许你可以只使用一个请求,取决于你的数据结构。 如果你不能,你可以用一个文件只有计数,查询这个文件,你得到所有的计数在一个小的要求。

但我认为这里的优化是没有必要的。 这些查询是为pipe理员。 想象一下,你有1个pipe理员和10 000个用户连接到你的网站,这些查询不是用户,只为你,有时使用; 影响是微不足道的。

此外,您的查询从asynchronous的事实中受益,所以您的应用程序可以在同一时间响应其他用户。