評価とaverageRatingはどちらも仮想フィールドである必要があります。そうしないと、コレクションにproduct.ratings = 0
のエントリがあると、/0除算によってスキーマがクラッシュします。 。したがって、最初に、仮想フィールドのゲッター関数によって評価を定義します。
productSchema.virtual("numberRatings").get(function() {
return this.ratings.length;
});
this.ratings
と仮定します この特定の製品のすべての評価が格納されている配列です。このようにして、product.numerRatings
にアクセスするたびに 、その配列内の更新されたエントリ数が表示されます。これを念頭に置いて、averageRatingに条件付きロジックを少し追加する必要があります:
productSchema.virtual("averageRating").get(function() {
return this.ratings.length > 0 ? this.totalRating / this.ratings.length : 0;
});
配列に評価がない限り、product.averageRating
問題のある除算を試みることなく、0を生成します。アレイに評価が含まれ始めた瞬間に、平均が計算されます。