簡體   English   中英

貓鼬和平均評分在一個集合?

[英]Mongoose & getting average of ratings in a collection?

我有一個使用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});

我已經看過Mongoose 聚合運算符 ,但是我不確定如何將其應用於我的案例。 偽代碼如下所示:

  • 查找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提供了功能,我寧願加以利用。

任何幫助,將不勝感激。

這應該適用於您的聚合管道:

[
    {
        $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無效。 我假設這些只是存根。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM