如何使多个对象高效地/高性能地找到一个并更新多个集合?

时间:2019-01-01 08:15:27

标签: node.js mongodb mongoose e-commerce

我正在使用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);
                    }
                }
            }

2 个答案:

答案 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) {
        //
    }
}