Ambos ratings e averageRating devem ser campos virtuais:caso contrário, a divisão /0 irá travar seu esquema no momento em que você tiver uma entrada em sua coleção com
product.ratings = 0
. Então, o que eu faria é, em primeiro lugar, definir classificações por uma função getter para um campo virtual:productSchema.virtual("numberRatings").get(function() {
return this.ratings.length;
});
Supondo que
this.ratings
é uma matriz onde todas as classificações para este produto específico são armazenadas. Dessa forma, cada vez que você acessar product.numerRatings
, a quantidade atualizada de entradas nesse array será exibida. Com isso em mente, você só precisa adicionar um pouco de lógica condicional ao seu averageRating:productSchema.virtual("averageRating").get(function() {
return this.ratings.length > 0 ? this.totalRating / this.ratings.length : 0;
});
Desde que não haja classificações na matriz,
product.averageRating
produzirá um 0, sem tentar qualquer divisão problemática. No momento em que a matriz começar a conter classificações, uma média será calculada.