И оценките, и averageRating трябва да бъдат виртуални полета:в противен случай разделянето /0 ще срине вашата схема в момента, в който имате запис в колекцията си с product.ratings = 0
. И така, това, което бих направил, е първо да дефинирам оценки чрез функция за получаване на виртуално поле:
productSchema.virtual("numberRatings").get(function() {
return this.ratings.length;
});
Ако приемем, че this.ratings
е масив, в който се съхраняват всички оценки за този конкретен продукт. По този начин всеки път, когато влизате в product.numerRatings
, ще се покаже актуализираното количество записи в този масив. Имайки това предвид, просто трябва да добавите малко условна логика към средната си оценка:
productSchema.virtual("averageRating").get(function() {
return this.ratings.length > 0 ? this.totalRating / this.ratings.length : 0;
});
Докато в масива няма оценки, product.averageRating
ще произведе 0, без да прави опит за проблемно деление. В момента, в който този масив започне да съдържа оценки, ще бъде изчислена средна стойност.