Ratings et averageRating doivent être des champs virtuels :sinon, la division /0 va planter votre schéma au moment où vous avez une entrée dans votre collection avec product.ratings = 0
. Donc, ce que je ferais, c'est d'abord définir les notes par une fonction getter pour un champ virtuel :
productSchema.virtual("numberRatings").get(function() {
return this.ratings.length;
});
En supposant que this.ratings
est un tableau dans lequel toutes les évaluations de ce produit particulier sont stockées. De cette façon, chaque fois que vous accédez à product.numerRatings
, le nombre mis à jour d'entrées dans ce tableau sera affiché. Dans cet esprit, il vous suffit d'ajouter un peu de logique conditionnelle à votre note moyenne :
productSchema.virtual("averageRating").get(function() {
return this.ratings.length > 0 ? this.totalRating / this.ratings.length : 0;
});
Tant qu'il n'y a pas d'évaluations dans le tableau, product.averageRating
produira un 0, sans tenter de division problématique. Au moment où le tableau commence à contenir des notes, une moyenne sera calculée.