【发布时间】: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
底部缺少第二个函数
【问题讨论】:
-
根据mongoosejs.com/docs/api/aggregate.html#aggregate_Aggregate-exec 的文档,您应该使用 exec 方法传递回调函数。
标签: javascript node.js mongodb asynchronous async-await