首页 > 解决方案 > Mongoose 嵌套查询 - 查找和更新不同文档中的两个字段

问题描述

我想做的是让一个用户向另一个用户发送一个金额,我希望从发件人的余额中减去该金额,并添加到接收者的余额中。问题是接收方余额已更新并且可以正常工作,但是之前从发送方减去金额的查询不起作用。

我知道猫鼬中没有连接(至少不是经典意义上的),所以我需要先查询用户的余额,然后在另一个查询中更新它。但肯定有办法嵌套这些查询吗?我希望我只是语法错误。

用户.js

const { Decimal128 } = require("mongodb");
const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const UserSchema = new Schema({
  email: {
    type: String,
    required: true,
  },
  password: {
    type: String,
    required: true,
  },

  name: {
    type: String,
    required: true,
  },

  useraddress: {
    type: String,
    required: true,
  },

  userbalance: {
    type: Decimal128,
    required: true,
  }
});

module.exports = User = mongoose.model("users", UserSchema);

服务器.js

app.post("/sendamount", function (req, res) {
  var amount = 100;
  var senderAddress = "Bob123";
  var receiverAddress = req.body.receiver;
  
  // Take amount from sender balance
  User.findOne({useraddress:senderAddress}, (err, sub) => {
    if (err) return handleError(err);
    var mybalance = parseFloat(sub.userbalance)
    console.log(mybalance)

    User.findOneAndUpdate(
      { useraddress: senderAddress },
      { userbalance: mybalance - amount }),
    
    // send to receiver balance
    User.findOne({useraddress:receiverAddress}, (err, sub2) => {
      if (err) return handleError(err);
      var receiverbalance = parseFloat(sub2.userbalance)
      console.log(receiverbalance)

      // add amount to receiver's balance
      User.findOneAndUpdate(
        { useraddress: receiverAddress },
        { userbalance: receiverbalance + amount }, 
        function (err, data) {
          if (err) res.send(err);
          res.send(data);
          console.log("found " + data)
          }
        )
      })
    })
  })

有人介意检查我的代码吗?谢谢

标签: node.jsmongodbmongoosemongodb-query

解决方案


尝试这个子轨道过程我添加了示例字段,你有这个区域改变

const asyncSubtrackProcess = async (id, amount) => await User.findOneAndUpdate({
            _id: mongoose.Types.ObjectId(id),
            userbalance: { $gt: 0 }
        },
        {
            $inc: {
                userbalance: - parseInt(amount)
            }
        });

const result = () => amounts.map(async item => await asyncSubtrackProcess(item.id, item.amount));
    result();

推荐阅读