2016-08-24 24 views
0

私は、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 
     }] 
    } 

私は平均値を自分で計算することができますが、マングースは、機能を提供する場合、私はむしろだろうそれを活用する。

ご協力いただければ幸いです。

+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の名前が無効です。私はそれらがちょうどスタブされていると仮定しています。

+0

これは私のために働きます。私が提供したObjectIdは実際のものではなく、例のために偽の値を提供しただけです。ところで、グループからプロジェクトに他の値を転送するために_idを使用する理由はありますか? –

+0

はい、$ groupを指定するたびに、そのグループの_idを指定する必要があります。それは必須です。それはあなたが使いたいキー別のユニークなグループです。次に、$プロジェクトは、キーを構成する値をドキュメントのルートレベルに戻すために使用されます。 – Wake

関連する問題