Voici mon fichier recipe.js
...Ma méthode statique ne fonctionne pas
const express = require('express');
const mongoose = require('mongoose');
const User = require('../model/user');
require('mongoose-currency').loadType(mongoose);
const Currency = mongoose.Types.Currency;
const Schema = mongoose.Schema;
const reviewSchema = require('../model/review');
let recipeSchema = new Schema({
name: {
type: String,
required: true
},
description: {
type: String,
},
steps: {
type: String,
required: true,
},
ingredients: {
type: Array,
default: ['1', '2', '3', '4']
},
category: {
type: String,
required: true,
index: true
},
postedBy: {
type: String,
required: true,
},
reviewsOfRecipe: [reviewSchema],
numberOfRatings: {
type: Number,
default: 0
},
totalAddedRatings: {
type: Number,
default: 0
},
reviewAverage: {
type: Number,
default: 0
},
postersCreationDate: {
type: Number,
index: true
},
likedBy: {
type: Array
},
reviewedBy: {
type: Array
}
});
// Here is my static method
recipeSchema.methods.calculateAverage = function(){
let recipe = this;
if (recipe.numberOfRatings === 0 && recipe.totalAddedRatings === 0){
recipe.reviewAverage = 0;
}
else {
recipe.reviewAverage = recipe.totalAddedRatings/recipe.numberOfRatings
}
};
let Recipe = mongoose.model('Recipe', recipeSchema);
module.exports = Recipe;
Dans mon fichier routeur, chaque fois qu'un utilisateur soumet un commentaire pour une recette, les champs numberOfRatings
et totalAddedRatings
incrémentée. Et après leur incrémentation, ma méthode statique calculateAverage
doit exécuter et mettre à jour le document.
Voici à quoi il ressemble dans mon code:
Recipe.findOneAndUpdate({_id: recipe._id, postersCreationDate: recipe.postersCreationDate},{$inc: {numberOfRatings: 1, totalAddedRatings: reviewScore}}, {returnNewDocument: true}).then((recipe) => {
recipe.calculateAverage();
});
Cependant, chaque fois qu'un utilisateur soumet une critique, bien que numberOfRatings
et numberOfRatings
incrémentée en conséquence, reviewAverage
ne fonctionne pas.
Je pense à la place reviewAverage
comme un champ virtuel à la place; mais je crains que cela ne rende plus difficile et inefficace de trier les recettes selon les moyennes les plus élevées et les plus basses.
Je bricoler avec elle, et il est toujours en supposant que les deux '' numberOfRatings' et totalAddedRatings' sont nuls en dépit d'être incrémentée, alors je reçois encore « reviewAverage' étant encore zéro. – MountainSlayer
Il s'avère que les hooks de pré-sauvegarde ne sont pas exécutés sur findOneAndUpdate() je vais changer ma réponse – Ero