我正在使用mongodb和nodejs,我的用例就是这样,
当用户购买分数存储在其用户文档中的产品时,我将需要更新产品文档以减少其库存,然后需要降低用户文档中用户的分数,然后需要创建商品交易记录。这里涉及三个集合,我应该在嵌套的promise结构中执行3次findOne和Save()吗?
或者还有其他更有效的方法吗?
我当前正在使用蒙古语,应该改为使用mongodb官方客户端吗?
contentType: "application/json",
dataType: "json",
data: JSON.stringify(reportCriteria),
success: function (response) {
console.log(response);
if (response.reportResult != null) {
for (var i = 0 ; i < response.reportResult.length; i++) {
var data = "<tr>" +
"<td class='reportTbl'>" + moment(new Date(parseInt(response.reportResult[i].InvoiceDate.substr(6))).toLocaleDateString()).format('YYYY-MMMM-DD') + "</td>" +
"<td class='reportTbl'>" + response.reportResult[i].InvoiceNumber + "</td>" +
"<td class='reportTbl'>" + response.reportResult[i].TotalValueWithVAT + "</td>" +
"<td class='reportTbl'>" + response.reportResult[i].**PartialPayments.ChequeNumber** + "</td>" +
"</tr>";
$('#completedPaymentReportTbl tbody').after(data);
}
}
}
答案 0 :(得分:3)
就像@Raj Kumar的答案一样,您应该使用异步函数,但是我想补充一点,Promise.all
的使用而不是等待每个请求本身。最终代码为
async function purchase() {
try {
let promise1 = Collection1.findOneAndUpdate(
condition,
update
);
let promise2 = Collection2.findOneAndUpdate(
condition,
update
);
let promie3 = Collection3.findOneAndUpdate(
condition,
update
);
let result = await Promise.all([promise1, promise2, promise3])
} catch(err) {
// handle error in any promise
}
}
答案 1 :(得分:1)
改用findOneAndUpdate。这会帮助小孩子。请参阅文档:https://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate
并尝试避免回调,而是使用async await,因为猫鼬会在任何数据库操作中返回promise。
async function purchase() {
try {
let doc1 = await Collection1.findOneAndUpdate(
condition,
updatedDoc
);
let doc2 = await Collection2.findOneAndUpdate(
condition,
updatedDoc
);
let doc3 = await Collection3.findOneAndUpdate(
condition,
updatedDoc
);
} catch(err) {
//
}
}