Zarówno ratings, jak i średniaRating powinny być polami wirtualnymi:w przeciwnym razie podział /0 spowoduje awarię schematu w momencie, gdy w kolekcji pojawi się wpis z product.ratings = 0
. Po pierwsze, chciałbym zdefiniować oceny za pomocą funkcji pobierającej dla wirtualnego pola:
productSchema.virtual("numberRatings").get(function() {
return this.ratings.length;
});
Zakładając, że this.ratings
to tablica, w której przechowywane są wszystkie oceny dla tego konkretnego produktu. W ten sposób za każdym razem, gdy uzyskujesz dostęp do product.numerRatings
, zostanie wyświetlona zaktualizowana liczba wpisów w tej tablicy. Mając to na uwadze, wystarczy dodać trochę logiki warunkowej do swojej średniej oceny:
productSchema.virtual("averageRating").get(function() {
return this.ratings.length > 0 ? this.totalRating / this.ratings.length : 0;
});
Dopóki w tablicy nie ma ocen, product.averageRating
da 0, bez próby dzielenia. W momencie, gdy tablica zacznie zawierać oceny, zostanie obliczona średnia.