我们正在开发一个让人们借钱的应用程序。我有一个node.js + mongodb逻辑,我真的不知道如何处理它。
数据模型如下所示,表示愿意向其他人借钱的用户名单(假设只有3家贷方):
[
{
_id:"100",
amount:10.00
},
{
_id:"101",
amount:10.00
},
{
_id:"102",
amount:20.00
}
]
有一个用户想借,比如$ 20.00并点击提交。后端node.js将查询mongodb执行以下逻辑:
1。通过限制20条记录来查询mongodb 代码:
db.collection('post').find(
{
borrowed_date:{$exists:false}
}).toArray(function(err, result) {
});
2。循环通过结果并累计金额,直到与借款人的金额完全匹配。 第3。为那些匹配的记录更新mongodb,最后得到的数据库如下(借20美元):
[ { _id: “100” 金额:10.00, borrowed_date:ISODate( “2016-02-16T06:43:29.869Z”) },
{ _id: “101”, 金额:10.00, borrowed_date:ISODate( “2016-02-16T06:43:29.869Z”) },
{ _id: “102”, 金额:10.00 } ]
代码:
db.collection('post').update(
{
_id:100,
borrowed_date:{$exists:false}
},
{$set:{borrowed_date:new Date()}},
{w:1},
function(err, result) {
});
上面的步骤我使用async.waterfall来控制。如果每个借用者点击借位按钮之间的时间是10秒,那就不会有问题:
如果在给定时间2借款人在同一时间借款,那将是一个问题。假设借款人1要借20美元而借款人1要借10美元。 因此,在步骤1中,两个borrower1将获得2个id为100和101的记录.borrower2将获得1个id为100的记录(他应该获得id 102)。
async.waterfall是异步的,不会等到所有函数完成后第二个请求进入瀑布循环。
知道如何处理这种情况吗?
答案 0 :(得分:0)
使用setImmediate将包装所有逻辑以获取所有发布,因此它一次一个
**
如果要将函数排在任何I / O后面,请使用setImmediate 已经在事件队列中的事件回调。
**
setImmediate(function searchPost() {
// all code here
});