Sia ratings che averageRating dovrebbero essere campi virtuali:altrimenti, la divisione /0 andrà in crash il tuo schema nel momento in cui avrai una voce nella tua collezione con product.ratings = 0
. Quindi quello che farei è, in primo luogo, definire le valutazioni tramite una funzione getter per un campo virtuale:
productSchema.virtual("numberRatings").get(function() {
return this.ratings.length;
});
Supponendo che this.ratings
è un array in cui sono archiviate tutte le valutazioni per questo particolare prodotto. In questo modo, ogni volta che accedi a product.numerRatings
, verrà visualizzata la quantità aggiornata di voci in quell'array. Tenendo presente questo, devi solo aggiungere un po' di logica condizionale alla tua valutazione media:
productSchema.virtual("averageRating").get(function() {
return this.ratings.length > 0 ? this.totalRating / this.ratings.length : 0;
});
Finché non ci sono valutazioni nell'array, product.averageRating
produrrà uno 0, senza tentare alcuna divisione problematica. Nel momento in cui l'array inizia a contenere valutazioni, verrà calcolata una media.