node.js - 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)
}
)
})
})
})
有人介意检查我的代码吗?谢谢
解决方案
尝试这个子轨道过程我添加了示例字段,你有这个区域改变
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();
推荐阅读
- java - 除域前三个字符外,用于屏蔽电子邮件的正则表达式
- sql - Oracle regexp_substr 提取数据 - 2
- python - Django Rest API - django-rest-auth
- reactjs - 参数更改时 useEffect 不会重新运行
- automation - 如何自动替换视频中的音轨?
- scala - Playframework 2.8 setSession 适用于 Postman,但不适用于浏览器
- docker-compose - 将卷添加到 SeaweedFS docker-compose 文件
- html - 如何让我的网站在放大和缩小时不变形?
- c# - REST 调用从 Oracle 数据库返回空列表
- c# - 无法加载 DLL 'Microsoft.WITDataStore32.dll':找不到指定的模块。(来自 HRESULT 的异常:0x8007007E)