如何在Node.JS中使用MongoDB进行更新操作

3
我有这段代码想要编写,它的作用是在正确计算余额后更新MongoDB中的余额。问题在于,虽然它可以正确计算余额,但无法更新用户列的内容。我一直在寻找如何更新余额,但没有找到任何有帮助的信息。
我的代码如下:
const router = require("express").Router();
const User = require("../models/User");
const bcrypt = require("bcrypt");
const jwt = require("jsonwebtoken");


router.post("/update-balance/:email", async (req, res) => {

    try {
        if (
          !req.headers.authorization ||
          !req.headers.authorization.startsWith("Bearer ") ||
          !req.headers.authorization.split(" ")[1]
        ) {
          return res.status(422).json({ message: "Please Provide Token!" });
        }

        const amount = parseInt(req.body.amount);

        const user = await User.find({ email: req.params.email });
        const balance = parseInt(user[0].balance);

        //return balance;
        //console.log(balance);

        const total_amt = amount + balance;
        //console.log(total_amt);

        // update Balance
        const wallet_user = new User();
        try{
          await wallet_user.updateOne({email : req.params.email}, {$set: {balance: total_amt}});
        }catch(err){
          console.log(err);
        }

        return res.send({ error: false, message: "OK" });

      } catch (error) {
        res.status(404).json({ message: error.message });
      }

});



module.exports = router;

我应该做什么,我做得不对,请帮帮我。

上面的代码显示了我尝试过的内容。

1个回答

1
您可以使用 $inc
router.post('/update-balance/:email', async (req, res) => {
  try {
    if (
      !req.headers.authorization ||
      !req.headers.authorization.startsWith('Bearer ') ||
      !req.headers.authorization.split(' ')[1]
    ) {
      return res.status(422).json({ message: 'Please Provide Token!' });
    }

    const amount = parseInt(req.body.amount);

    try {
      await User.findOneAndUpdate(
        { email: req.params.email },
        { $inc: { balance: amount } }
      );
    } catch (err) {
      console.log(err);
    }

    return res.send({ error: false, message: 'OK' });
  } catch (error) {
    res.status(404).json({ message: error.message });
  }
});

$inc并不是简单地相加,而是以某种方式将数字翻倍。就像在钱包中,用户有50美元,然后他再支付7000美元,他应该得到7050美元,但实际上他得到了7660美元。不知道为什么会这样。 - Diddy
$set 已经生效了!使用几乎相同的代码和 $set 参数,一切都很好。再次感谢。 - Diddy
@Diddy,这不合理,因为$set会更新您传递的任何值,而不是像期望的那样添加。例如,如果当前余额为50,并使用{ $set: { balance: 7000 } }进行更新,则新余额将为7000。另一方面,$inc通过将任何值添加到当前值来更新余额。例如,使用{ $inc: { balance: 7000 } }进行更新,则新余额将为7050,就像OP在其解决方案中建议的那样。 - chridam
@chridam 如果你看一下我所做的,我已经完成了计算,我需要做的是将计算结果存入数据库。然后我按照他代码中的一些东西,使它按预期工作。 - Diddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接