如何使用Express提交评级并将新的平均评级分配给MongoDB数据库?

aor9mmx1  于 2023-10-16  发布在  Go
关注(0)|答案(1)|浏览(107)

我目前正在为我的大学学位做一个后端项目,专注于Node.JS,MongoDB和Express,到目前为止,它有点顺利。然而,这个任务(主要是创建一个API)要求我创建一个接受评级的路由,并将其与userId沿着发送到数据库,以使评级唯一。这是工作,但同样的路由还需要我计算一个平均评级,发送到我的数据库中的一个averageRating。我已经成功地发送了星星评级,但我不知道如何分配平均评级。我正在使用一个计算平均值的函数,并试图将其结果作为updateOne()的参数传递,但它不起作用。有人知道是怎么回事吗?代码如下

exports.bookRating = (req, res) => {
  Book.findOne({ _id: req.params.id })
    .then((book) => {
      if (!book) {
        const newRating = new Book({
          userId: req.auth.userId,
          grade: req.body.rating,
        });
      } else if (req.body.rating < 1 || req.body.rating > 5) {
        throw new Error("La note n'est pas valide !");
      } else {
        const ratings = book.ratings;
        if (!ratings.find((rating) => rating.userId === req.auth.userId)) {
          const newRating = {
            id: req.params.id,
            userId: req.auth.userId,
            grade: req.body.rating,
          };
          ratings.push(newRating);
          book.save();
          const calculatedAverage = calculateAverageRating(ratings);
          Book.updateOne(
            { _id: req.params.id },
            { averageRating: calculatedAverage }
          )
            .save()
            .then(() => res.status(200).json({ book }))
            .catch((error) =>
              res.status(400).json({ error: "Echec de la moyenne" })
            );
        }
      }
    })
    .catch((error) => res.status(400).json({ error: "une autre erreur" }));
};

function calculateAverageRating(ratings) {
  let totalGrades = ratings.reduce((sum, rating) => sum + rating.grade, 0);
  return totalGrades / ratings.length;
}

我希望计算出的平均值被分配给数据库中的averageRating字段,但我得到了一个代码400 Bad Request错误。但是,userId/rating对已成功发送到数据库

qvtsj1bj

qvtsj1bj1#

您正在尝试使用.updateOne()方法,然后对结果调用.保存(),这不是在Mongoose中更新单个文档的正确方法。相反,您可以使用.findOneAndUpdate()方法来更新现有文档。像这样的东西应该会有用,

Book.findOneAndUpdate(
  { _id: req.params.id },
  { averageRating: calculatedAverage },
  { new: true } // This option returns the updated document
)
.then((updatedBook) => {
  res.status(200).json({ book: updatedBook })
})
.catch((error) =>
  res.status(400).json({ error: "Echec de la moyenne" })
)

相关问题