Hodnocení i průměrné hodnocení by měly být virtuální pole:jinak divize /0 zhroutí vaše schéma v okamžiku, kdy budete mít ve sbírce položku s product.ratings = 0
. Takže to, co bych udělal, je zaprvé definovat hodnocení pomocí funkce getter pro virtuální pole:
productSchema.virtual("numberRatings").get(function() {
return this.ratings.length;
});
Za předpokladu, že this.ratings
je pole, kde jsou uložena všechna hodnocení pro tento konkrétní produkt. Tímto způsobem při každém přístupu k product.numerRatings
, zobrazí se aktualizovaný počet záznamů v tomto poli. S ohledem na to stačí ke svému průměrnému hodnocení přidat trochu podmíněné logiky:
productSchema.virtual("averageRating").get(function() {
return this.ratings.length > 0 ? this.totalRating / this.ratings.length : 0;
});
Pokud pole neobsahuje žádná hodnocení, product.averageRating
vytvoří 0, aniž by se pokusil o jakékoli problematické dělení. V okamžiku, kdy pole začne obsahovat hodnocení, bude vypočítán průměr.