Sowohl ratings als auch averageRating sollten virtuelle Felder sein:Andernfalls wird die Division /0 Ihr Schema zum Absturz bringen, sobald Sie einen Eintrag in Ihrer Sammlung mit product.ratings = 0
haben . Was ich also tun würde, ist zunächst, Bewertungen durch eine Getter-Funktion für ein virtuelles Feld zu definieren:
productSchema.virtual("numberRatings").get(function() {
return this.ratings.length;
});
Angenommen, this.ratings
ist ein Array, in dem alle Bewertungen für dieses bestimmte Produkt gespeichert sind. Auf diese Weise jedes Mal, wenn Sie auf product.numerRatings
zugreifen , wird die aktualisierte Anzahl von Einträgen in diesem Array angezeigt. Vor diesem Hintergrund müssen Sie nur ein wenig Bedingungslogik zu Ihrer averageRating hinzufügen:
productSchema.virtual("averageRating").get(function() {
return this.ratings.length > 0 ? this.totalRating / this.ratings.length : 0;
});
Solange keine Bewertungen im Array vorhanden sind, wird product.averageRating
ergibt eine 0, ohne eine problematische Division zu versuchen. Sobald dieses Array beginnt, Bewertungen zu enthalten, wird ein Durchschnitt berechnet.