猫鼬&获得集合中的评分平均值?

时间:2016-08-24 15:22:45

标签: javascript node.js mongodb mongoose average

我有一个使用Mongoose的基于NodeJS的应用程序。我想创建一个回复,其中值是对回答调查问卷的人提供的平均评分,针对每个问题。

我的架构如下所示:

const questionnaireResultSchema = new Schema({      
   user: { type: ObjectId, ref: 'User' },
   questionnaire: { type: ObjectId, ref: 'Questionnaire' },
   rating: [{
       id: Number,
       question: String,
       value: Number
   }]
},{
    timestamps: true
}).index({user: 1, questionnaire: 1}, {unique: true});

我看过猫鼬aggregator operator,但我不确定如何将它应用于我的情况。伪代码如下所示:

  • 查找id xyz
  • 调查问卷的所有问卷调查结果
  • 提供每个问卷调查结果的评分均衡的结果

例如,响应如下:

[{
   id: 1,
   question: 'How strongly do you feel about candidate A?',
   value: 12 // averaged value
 },{
   id: 2,
   question: 'How strongly do you think we should change the sky color to green?',
   value: 31 // averaged value
 },{
   id: 3,
   question: 'How strongly do you think your answers count?',
   value: 20 // averaged value
 }]

我试过了:

QuestionnaireResultSchema.aggregate([{ 
    $match: {
        questionnaire: questionnaire
    }},
        {$project: {
            scores: { $avg: '$scores'}
        }}
    ]);

这只提供了JSON:

[{
    "_id": "57bbd4b495407f6145b3ba9f",
    "scores": null
}]

集合中的示例文档需要:

 {
    user: ObjectId("57bca30536e376c653f439bb")
    questionnaire: ObjectId("37bca0feedb0bc470353ab")
    scores:     [{
        id: 1,
        question: 'How strongly do you feel about candidate A?',
        value: 3
      },{
        id: 2,
        question: 'How strongly do you think we should change the sky color to green?',
        value: 4 // averaged value
      },{
        id: 3,
        question: 'How strongly do you think your answers count?',
        value: 5 // averaged value
      }]
   }

虽然我可以自己计算平均值,但如果Mongoose提供功能,我宁愿利用它。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

这适用于您的汇总管道:

[
    {
        $match: {
            questionnaire: ObjectId("37bca0feedb0bc470353ab")
        }
    },
    {
        $unwind: "$rating"
    },
    {
        $group:{
            _id:{
                "rating_id": "$rating.id",
                "question": "$rating.question",
            },
            avg_rating: {$avg:"rating.value"}
        }
    },
    {
        $project:{
            "id": "$_id.rating_id",
            "question": "$_id.question",
            "avg_rating": "$avg_rating"
        }
    }
]

虽然您的示例文档具有“得分”而非“评分”,在这种情况下您将使用:

[
    {
        $match: {
            questionnaire: ObjectId("237bca0feedb0bc470353aba")
        }
    },
    {
        $unwind: "$scores"
    },
    {
        $group:{
            _id:{
                "rating_id": "$scores.id",
                "question": "$scores.question",
            },
            avg_rating: {$avg:"scores.value"}
        }
    },
    {
        $project:{
            "id": "$_id.rating_id",
            "question": "$_id.question",
            "avg_rating": "$avg_rating"
        }
    }
]

此外,您使用的某些ObjectId无效。我假设那些只是残留。

相关问题