【问题标题】:How to optimize the mongodb query in nodejs?如何优化nodejs中的mongodb查询?
【发布时间】:2020-09-15 01:39:01
【问题描述】:

我有一个在 nodejs 中运行的代码,我必须在其中调用具有一些聚合属性的 MongoDB 查询,并且我使用回调进行了调用,但主要问题是它没有按我预期的那样工作。就像我想异步运行代码但它不像我想要的那样工作这种方法,我需要帮助请给出解决方案。 这是代码。

        function (done) {
            var count = 0;
            Wine.distinct("_id", {}).exec(function(err,winesList){
                for(var x=0;x < 100;x++){
                    var currentWineId = winesList[x].toString();
                    //wineId should not be object
                    WTHelper.calculateAvgWinePriceAndUpdate(currentWineId, todayDate,'true', function (err, result) {
                        count++;
                        console.log("statusReport.totalCount :", count);
                    })
                } done(null, count);
            })
        }, function (count) {
            console.log("prateek totalCount :", count);
        }
    ])
     //Gets the avergae price of the last 4 Months of the wine
     var totalCount=0;
    purchase_date = getDayEndDate(purchase_date);
    var threeMonthsOldDate = new Date(purchase_date);
    threeMonthsOldDate.setMonth(threeMonthsOldDate.getMonth() - 3);
    var startDate = getDayStartDate(threeMonthsOldDate);
    var purchaseDateString = new Date(
        getDayStartDate(purchase_date)
    ).toDateString();
    console.log(
        "calculateAvgWinePriceAndUpdate: starting date :" +
        startDate +
        " purchase_date: ",
        purchase_date
    );

    console.log(
        "calculateAvgWinePriceAndUpdate: purchaseDateString",
        purchaseDateString
    );
    Transaction.aggregate(
        [
            {
                $match: {
                    transaction_type: "Cr",
                    reason: {
                        $nin: ["Edited", "Deleted"],
                    },
                },
            },
            {
                $unwind: "$details",
            },
            {
                $match: {
                    wine_id: wineId,
                    transaction_type: "Cr",
                    "details.price": {
                        $gt: 0,
                    },
                    purchase_date: {
                       // $gte: startDate,
                        $lte: purchase_date,
                    },
                },
            },
            {
                $group: {
                    _id: {
                        wine_id: "$wine_id",
                    },
                    total_price: {
                        $sum: {
                            $multiply: ["$details.qty", "$details.price_usd"],
                        },
                    },
                    total_qty: {
                        $sum: "$details.qty",
                    },
                },
            },
            {
                $sort: {
                    purchase_date: -1,
                },
            },
            {
                $limit: 50,
            },
            {
                $project: {
                    _id: 0,
                    wine_id: "$_id.wine_id",
                    total_price: "$total_price",
                    total_qty: "$total_qty",
                },
            },
        ],
        function (err, avgWinePriceData) {
            console.log(
                "calculateAvgWinePriceAndUpdate: Aggregate Result:",
                avgWinePriceData
            );
            var purchase_date_price = 0;
            var purchase_date_quantity = 0;

            if (avgWinePriceData.length) {
                // There are transactions
                var purchase_date_price = avgWinePriceData[0].total_price;
                var purchase_date_quantity = avgWinePriceData[0].total_qty;

                console.log(
                    "calculateAvgWinePriceAndUpdate: purchase_date_price ",
                    purchase_date_price
                );
                console.log(
                    "calculateAvgWinePriceAndUpdate: purchase_date_quantity",
                    purchase_date_quantity
                );
                //New Avg. Wine Price.
                var avgWinePrice = parseFloat(
                    purchase_date_price / purchase_date_quantity
                );
                if (isNaN(avgWinePrice)) {
                    avgWinePrice = 0;
                }
                console.log(
                    "calculateAvgWinePriceAndUpdate: Avg. Price for Purchase Date:",
                    avgWinePrice
                );
                console.log(
                    "calculateAvgWinePriceAndUpdate: Purchase Date:",
                    purchaseDateString
                );
                WinePrice.findOne(
                    {
                        wine_id: mongoose.Types.ObjectId(wineId),
                        price_date_string: purchaseDateString,
                    },
                    function (err, winePrice) {
                        //console.log('calculateAvgWinePriceAndUpdate: wine price object ',winePrice)
                     
                        if (winePrice) {
                            winePrice.purchase_date = new Date(purchase_date);
                            winePrice.price = avgWinePrice;
                            winePrice.quantity = purchase_date_quantity;
                        } else {
                            var winePrice = new WinePrice();
                            winePrice.historic_price = {};
                            winePrice.wine_id = mongoose.Types.ObjectId(wineId);
                            winePrice.price = avgWinePrice;
                            winePrice.price_date = new Date(purchase_date);
                            winePrice.price_date_string = purchaseDateString;
                            winePrice.purchase_date = new Date(purchase_date);
                            winePrice.quantity = purchase_date_quantity;
                        }

                        winePrice.save(function (err) {
                            if (err) {
                                console.log(
                                    "calculateAvgWinePriceAndUpdate: Error Saving Wine Price",
                                    err
                                );
                            } else {
                                console.log(
                                    "calculateAvgWinePriceAndUpdate: Price Updated for Purchase Date",purchaseDateString
                                );
                                 if (check == 'true') {
                                    totalCount++
                                    mainCallback(err, totalCount);
                                }
                            }
                        });
                     
                    });
            }
        }
    );
};

检查输出

statusReport.totalCount : 98
calculateAvgWinePriceAndUpdate: Price Updated for Purchase Date Sat Sep 12 2020
statusReport.totalCount : 99
calculateAvgWinePriceAndUpdate: Price Updated for Purchase Date Sat Sep 12 2020
statusReport.totalCount : 100
calculateAvgWinePriceAndUpdate: Price Updated for Purchase Date Sat Sep 12 2020

底部缺少第二个函数

【问题讨论】:

标签: javascript node.js mongodb asynchronous async-await


【解决方案1】:

如果您的查询不相关,则使用 promise.all 将并行执行您的查询。

或者它们是相互关联的,或者你想一个接一个地执行,那么你可以使用 async-await 方法将以异步方式同步执行您的数据库调用。

【讨论】:

    猜你喜欢
    • 2022-09-30
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 2015-01-21
    • 2015-01-09
    • 2015-03-06
    • 1970-01-01
    • 2021-04-28
    相关资源
    最近更新 更多