所以我正在为我的应用构建一个管理面板。在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,还是过度杀伤?如何使用异步?
答案 0 :(得分:1)
首先,最好尽可能优化,看看$or operator。 也许您可以只使用一个请求,具体取决于您的数据结构。 如果不能,您可以制作仅包含计数的文档,查询此文档,并在一个小请求中获得所有计数。
但我认为这里的优化不是必需的。这些查询适用于管理员。想象一下,您的1个管理员和1万个用户已连接到您的网站,这些查询不是针对您的,仅针对您,您有时会使用;影响是微不足道的。
此外,您的查询会受益于asynchrone,因此您的应用可以在同一时间响应其他用户。