mongoose / mongodb计算统计数据的最佳方法

时间:2016-11-11 18:35:49

标签: javascript mongodb performance mongoose

我有以下查询:

function calculate_stats() {
         Users.count().then(function(allusers) {
                Users.count().then(function(dead_users) {
                    Users.count().then(function(banned_users) {
                        Users.count().then(function(vacation_users) {
                            Users.count().then(function(in_hotel_users) {
                                var aliveusers = allusers - dead_users - banned_users;
                                var accounts = {
                                    registred: allusers,
                                    alive: aliveusers,
                                    dead: dead_users,
                                    banned: banned_users,
                                    vacation: vacation_users,
                                    inhotel: in_hotel_users,
                                    outsidehotel: aliveusers - in_hotel_users,
                                    outsidehotelonline: 0
                                };
                            });
                        });
                    });
                });
            });



        });
    }

但这是否是最好的方式来嵌套它们,以获得最终结果? 我将如何获得一个计算统计数据的好方法。

这不是表现有效吗?

1 个答案:

答案 0 :(得分:3)

由于所有查询似乎彼此独立,因此您可以并行执行它们。您可以使用Q之类的承诺库(使用Q.all方法)从所有人创建组合承诺,或者如果使用ES6则使用Promise.all

function calculate_stats() {
    var promiseArr = [
        Users.count(),
        Users.count(),
        Users.count(),
        Users.count(),
        Users.count()
    ]

    Q.all(promiseArr).then(function (results) {
        var allusers = results[0];
        var dead_users = results[1];
        // and so on

        var aliveusers = allusers - dead_users - banned_users;
        var accounts = {
            registred: allusers,
            alive: aliveusers,
            dead: dead_users,
            banned: banned_users,
            vacation: vacation_users,
            inhotel: in_hotel_users,
            outsidehotel: aliveusers - in_hotel_users,
            outsidehotelonline: 0
        };
    })

});
}