【问题标题】:My static method is not running我的静态方法没有运行
【发布时间】:2017-07-06 22:10:47
【问题描述】:

这是我的recipe.js 文件...

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;

在我的路由器文件中,每次用户提交对食谱的评论时,numberOfRatingstotalAddedRatings 字段都会增加。在它们增加后,我的静态方法calculateAverage 应该运行并更新文档。

这是我的代码中的样子:

Recipe.findOneAndUpdate({_id: recipe._id, postersCreationDate: recipe.postersCreationDate},{$inc: {numberOfRatings: 1, totalAddedRatings: reviewScore}}, {returnNewDocument: true}).then((recipe) => {

               recipe.calculateAverage();
});

但是,每次用户提交评论时,虽然 numberOfRatingsnumberOfRatings 会相应增加,但 reviewAverage 不会。

我正在考虑将reviewAverage 设置为虚拟字段;但我担心这样做会使按照最高和最低评论平均数对食谱进行排序变得更加困难和低效。

【问题讨论】:

    标签: javascript node.js mongodb mongoose mongoose-schema


    【解决方案1】:

    首先,关于您的 findOneAndUpdate 的一些事情可能会发生变化。 Id 应该足以找到,并且“returnNewDocument”不是一个选项。在猫鼬中,它只是“新”

    Recipe.findOneAndUpdate({_id: recipe._id},{$inc: {numberOfRatings: 1, totalAddedRatings: reviewScore}}, {new: true}).then((recipe) => {
        recipe.calculateAverage();
    });
    

    问题在于您没有将平均值保存到配方中。

    recipeSchema.methods.calculateAverage = function(callback) {
      let recipe = this;
      if (recipe.numberOfRatings === 0  && recipe.totalAddedRatings === 0) {
          recipe.reviewAverage = 0;
      }
      else {
          recipe.reviewAverage = recipe.totalAddedRatings / recipe.numberOfRatings
      }
      recipe.save(callback);
    };
    

    【讨论】:

    • 我正在修改它,它总是假设 numberOfRatingstotalAddedRatings 尽管增加了但都为零,所以我仍然得到 'reviewAverage` 仍然为零。
    • 原来在 findOneAndUpdate() 上没有执行预保存挂钩,我会改变我的答案
    猜你喜欢
    • 2019-08-21
    • 2013-04-01
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 2018-09-21
    • 2018-05-20
    • 2016-12-27
    • 2018-01-27
    相关资源
    最近更新 更多