我在NodeJS中處理一個巨大的數據集時遇到了問題。我正在使用異步,因爲我想在完成所有事情時調用res.send
。NodeJS異步大數據集回調
casus:
在該項目的MongoDB集合中,可以添加活動。商店能夠加入這些廣告系列,並將該廣告系列中的一些操作添加到該日程安排中。 (如發佈Facebook消息,發送給Instagram的照片) 在網站的前端,有一個顯示所有活動活動的頁面。廣告系列打開後,必須列出加入此廣告系列的所有商店的列表。
因爲每個商店都有一個議程,我要保存哪些任務要做的地方,我必須通過所有商店循環查看是否有活動與活動相關,與活動中打開的活動ID相同。 商店收藏中有超過3500個條目,所以在處理每個商店時可能需要一段時間,所以我決定在頁面加載時使用angular來發布該請求。
問題:
正如你可以在下面的代碼中看到,我得到的所有商店,並遍歷項目。然後我循環查看議程項目,看看是否有匹配的campaignID,然後在數組中添加一些我想要發回的信息。但代碼在一家商店後停止。如何添加陣列中的所有商店,並在處理所有商店時發送全部商品?
Shopmodel:
(不是所有領域)
var Shop = new Schema({
name:String,
email:String,
phone: String,
agenda:[{
campaignId:Schema.ObjectId,
taskId:Schema.ObjectId,
campaignName: String,
downloaded: Boolean,
success: Boolean,
startDate:Date,
endDate:Date,
description:String,
kind:String
}],
},{collection:'shop'});
守則控制器:
module.exports.getCampaignShop = function(req,res){
console.log("getCampaignShop");
var campaignId = req.query['campaignId'];
console.log("campaignId", campaignId);
var result = [];
Shop.find().sort({name:1}).exec(function(err, shops){
console.log("shop count", shops.length);
async.eachSeries(shops, function(shop, allDone){
async.eachSeries(shop.agenda, function(agenda, shopComplete){
if(agenda.campaignId == campaignId){
var shopResult = {
shopId: shop._id,
nameSlug: shop.nameSlug,
logo: shop.logo,
name: shop.name
}
console.log("shopResult", shopResult);
result.push(shopResult);
shopComplete();
}
})
allDone();
}, function(err){
if (err) throw err;
console.log("result length", result.length);
res.send(result);
})
})
}
您是否試圖編寫一個僅返回商店的請求,其中議程中的大於1的元素具有與您想要的相同的選項? MongoDB可以緩解你很多時間 – DrakaSAN