mongodb Mongoose在put请求中划分两个字段

ldioqlga  于 2022-11-28  发布在  Go
关注(0)|答案(2)|浏览(135)

我可以用两个字段的除法来更新文档中的字段吗?使用Node和MongoDB,我试图创建一个rating函数,我必须进行除法运算,但似乎没有任何效果。我希望rating的新值是,当前值除以投票数。

router.put("/:id/:rating", async (req, res) => {
    const movie_rating = parseInt(req.params.rating);
    try {
        const updatedMovie = await Movie.findByIdAndUpdate(
            req.params.id,
            {
                $inc: { noVotes: 1 },
                $inc: { rating: movie_rating },
                $divide: { rating: [rating, noVotes] },
                // rating: { $divide: [rating, noVotes] }
            },
            { new: true }
        );
        res.status(200).json(updatedMovie);
    } catch (err) {
        res.status(500).json(err);
    }
});
zbq4xfa0

zbq4xfa01#

您需要更改几项内容
Sample

db.collection.update({},
[
  {
    "$set": {
      "key2": {
        $add: [
          "$key2",
          1
        ]
      },
      key3: {
        "$divide": [
          {
            $add: [
              "$key2",
              1
            ]
          },
          "$key"
        ]
      },
      
    }
  }
],
{
  "multi": true,
  "upsert": false
})

1.您需要聚合更新,因为您需要divide
1.不能在同一操作中使用更新的值
1.不能在聚合更新中组合$inc,$set
1.或者,您可以使用$add代替$inc
1.您可以重新执行除法运算的操作,而不是进行另一个更新调用

dxpyg8gm

dxpyg8gm2#

这可以通过$set来完成,它看起来像这样:

router.put("/:id/:rating", async (req, res) => {
  const movie_rating = parseInt(req.params.rating);
  try {
    const updatedMovie = await Movie.findByIdAndUpdate(
      req.params.id,
      [
        {
          $set: {
            noVotes: { $sum: ["$noVotes", 1] },
            rating: { $sum: ["$rating", movie_rating] },
            averageRating: { $divide: ["$rating", "$noVotes"] },
          },
        },
      ],
      { new: true }
    );
    res.status(200).json(updatedMovie);
  } catch (err) {
    res.status(500).json(err);
  }
});

相关问题