Node.js Mongoose计算(数组,种群?)

时间:2016-10-29 20:06:53

标签: node.js mongodb express mongoose handlebars.js

我试图找出一种方法来计算MongoDB数据库中众多不同集合的数据。

基本上,我有一个应用程序向团队中的每个用户发送一个调查,允许他们以1-10的等级投票给团队中的其他用户。

我在Votes集合中收集这些数据,如下所示:

// Vote Schema

var voteSchema = mongoose.Schema({
    _creator: { 
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    },
    voteFor: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    },
    survey: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Survey'
    },
    rating : Number,
    status : String,
});

这是我本地开发人员数据库中的一些示例数据:

 "_id" : ObjectId("5812caceb4829937f4599b57"), "rating" : 10, "voteFor" : ObjectId("580fe9ba5b72196bc4a8d946"), "_creator" : ObjectId("580f8ddc5de2365b6852bc03"), "survey" : ObjectId("5812caaeb4829937f4599b54"), "__v" : 0 }
{ "_id" : ObjectId("5812caceb4829937f4599b58"), "rating" : 6, "voteFor" : ObjectId("58114aae3081aa62982b814d"), "_creator" : ObjectId("580f8ddc5de2365b6852bc03"), "survey" : ObjectId("5812caaeb4829937f4599b54"), "__v" : 0 }
{ "_id" : ObjectId("5812caddb4829937f4599b5a"), "rating" : 4, "voteFor" : ObjectId("580f8ddc5de2365b6852bc03"), "_creator" : ObjectId("58114aae3081aa62982b814d"), "survey" : ObjectId("5812caaeb4829937f4599b54"), "__v" : 0 }
{ "_id" : ObjectId("5812caddb4829937f4599b5b"), "rating" : 6, "voteFor" : ObjectId("580fc963911b2864e0ccfcc2"), "_creator" : ObjectId("58114aae3081aa62982b814d"), "survey" : ObjectId("5812caaeb4829937f4599b54"), "__v" : 0 }
{ "_id" : ObjectId("5812caddb4829937f4599b5c"), "rating" : 1, "voteFor" : ObjectId("580fc99e911b2864e0ccfcc3"), "_creator" : ObjectId("58114aae3081aa62982b814d"), "survey" : ObjectId("5812caaeb4829937f4599b54"), "__v" : 0 }
{ "_id" : ObjectId("5813ec0d12dd1731a8892bec"), "rating" : 4, "voteFor" : ObjectId("580f8ddc5de2365b6852bc03"), "_creator" : ObjectId("58114aae3081aa62982b814d"), "survey" : ObjectId("5813ebe112dd1731a8892beb"), "__v" : 0 }
{ "_id" : ObjectId("5813ec0d12dd1731a8892bed"), "rating" : 7, "voteFor" : ObjectId("580fc963911b2864e0ccfcc2"), "_creator" : ObjectId("58114aae3081aa62982b814d"), "survey" : ObjectId("5813ebe112dd1731a8892beb"), "__v" : 0 }
{ "_id" : ObjectId("5813ec0d12dd1731a8892bee"), "rating" : 5, "voteFor" : ObjectId("580fc99e911b2864e0ccfcc3"), "_creator" : ObjectId("58114aae3081aa62982b814d"), "survey" : ObjectId("5813ebe112dd1731a8892beb"), "__v" : 0 }

正如您所看到的,我将_creator,voteFor和调查作为ObjectId链接到各自的模型。

我尝试做的是在每个调查的前端页面上输出以下内容,如下所示:

Max
===
Total rating: 32 - this is the total of all the ratings where people voted for them (stored in ratings and voteFor, so I'd add up all the ratings that had voteFor as their userID in that particular survey and output it)

Average rating: 6
% of Survey total rating: 15%

John
===
Total rating: 60
Average rating: 9
% of Survey total rating: 34%

基本上我想根据我对其评级数据进行的一些数学计算,为特定调查中的每个用户创建/输出计算。

我已经尝试为模型运行查询查询并在评分数据上运行循环,以获得类似于"调查的总评分"但我仍然坚持如何在调查中获取每个用户的数据以及如何输出数据。

我很自在地进行数学计算,但我不确定如何构建查询或模型函数以允许我进行计算并将其发送到视图(使用把手)和右侧数据

我使用.populate吗?创建一个新模型以进行计算,然后将其单独输出到我的视图中?我不知道的其他事情?

我似乎无法使用文档搜索/搜索我已经完成并希望得到一些帮助!

干杯,

最高

2 个答案:

答案 0 :(得分:1)

要计算每个不同initButon(jButtonA,reponseA,quizz); 的所有记录,请使用$_creator聚合$group

$sum : 1

它给你:

var voteItems = mongoose.model('Votes', voteSchema);

voteItems.aggregate([{
    $group: {
        "_id": "$_creator",
        "count": { $sum: 1 }
    }
}], function(err, result) {
    console.log("number of ratings list : \n", result);
});

对于每个不同{ "_id" : ObjectId("58114aae3081aa62982b814d"), "count" : 6 } { "_id" : ObjectId("580f8ddc5de2365b6852bc03"), "count" : 2 } 的所有ratings的平均值,也请使用$_creator并使用$group

$avg

它给你:

voteItems.aggregate([{
    $group: {
        "_id": "$_creator",
        total: { $avg: "$rating" }
    }
}], function(err, result) {
    console.log("average ratings : ", result[0].total);
});

使用聚合检查可以实现更多目标:mongodb aggegrationgroup aggregation

答案 1 :(得分:0)

谢谢Bertrand。您的代码帮助我了解了聚合的工作原理以及如何使用它进行计算。感谢您的支持。

作为参考,我使用以下代码根据个人调查给出了每个人的评分。

//Get ratings for each user
            Vote.aggregate(
                [
                    { 
                        $match : { survey : mongoose.Types.ObjectId(req.params.id) } 
                    },
                    {   
                        $group: { "_id": "$voteFor", "total" : { $sum: "$rating" }
                    }},
                    {   $lookup: { "from": "users", "localField": "_id", "foreignField":"_id", "as": "user"} }
                ], 

                function(err, result) {
                    console.log(result);            
                });