Både vurderinger og gennemsnitsbedømmelse skal være virtuelle felter:ellers vil /0-divisionen ødelægge dit skema i det øjeblik, du har en post i din samling med product.ratings = 0
. Så hvad jeg ville gøre er for det første at definere vurderinger ved hjælp af en getter-funktion for et virtuelt felt:
productSchema.virtual("numberRatings").get(function() {
return this.ratings.length;
});
Forudsat at this.ratings
er et array, hvor alle vurderinger for dette specifikke produkt er gemt. På denne måde, hver gang du får adgang til product.numerRatings
, vil den opdaterede mængde af poster i det array blive vist. Med dette i tankerne skal du blot tilføje en lille smule betinget logik til din gennemsnitsvurdering:
productSchema.virtual("averageRating").get(function() {
return this.ratings.length > 0 ? this.totalRating / this.ratings.length : 0;
});
Så længe der ikke er nogen vurderinger i arrayet, product.averageRating
vil producere en 0, uden at forsøge nogen problematisk division. I det øjeblik det array begynder at indeholde vurderinger, vil et gennemsnit blive beregnet.