Både betyg och genomsnittsbetyg bör vara virtuella fält:annars kommer /0-divisionen att krascha ditt schema när du har en post i din samling med product.ratings = 0
. Så vad jag skulle göra är för det första att definiera betyg med en getter-funktion för ett virtuellt fält:
productSchema.virtual("numberRatings").get(function() {
return this.ratings.length;
});
Förutsatt att this.ratings
är en array där alla betyg för just denna produkt lagras. På detta sätt, varje gång du kommer åt product.numerRatings
, kommer den uppdaterade mängden poster i den arrayen att visas. Med detta i åtanke behöver du bara lägga till lite villkorlig logik till din genomsnittliga betyg:
productSchema.virtual("averageRating").get(function() {
return this.ratings.length > 0 ? this.totalRating / this.ratings.length : 0;
});
Så länge det inte finns några betyg i arrayen, product.averageRating
kommer att producera en 0, utan att göra någon problematisk division. I samma ögonblick som arrayen börjar innehålla betyg kommer ett genomsnitt att beräknas.