NodeJSで巨大なデータセットを処理する際に問題があります。すべてが完了したらres.send
に電話したいので、私は非同期を使用しています。NodeJS非同期大規模データセットコールバック
Casus:キャンペーンを追加することが可能であるこのプロジェクトのMongoDBのコレクションで
。ショップはそれらのキャンペーンに参加し、そのキャンペーンからいくつかのアクションをアジェンダに追加することができます。 (Facebookインスタントメッセージ、Instagramへの写真のように) サイトのフロントエンドには、アクティブなキャンペーンをすべて表示するページがあります。キャンペーンを開くと、このキャンペーンに参加したすべてのショップのリストが必要です。
すべてのショップにアジェンダがあるので、どの作業をするかが保存されているため、キャンペーンのIDと等しいものがキャンペーン内にあるかどうかをすべての店舗で確認する必要があります。 ショップコレクションには3500を超えるエントリーがあるので、すべてのショップが処理されるとしばらく時間がかかることがあるので、ページがロードされると、そのリクエストを投稿するためにangleを使用することに決めました。
問題:
あなたは以下のコードで見ることができるように、私は項目をすべてのお店、およびループを取得します。次に、アジェンダの項目をループして、一致するキャンペーンIDがあるかどうかを確認してから、返信したい情報を配列に追加します。しかし、コードは1店舗後に停止します。アレイ内のすべてのお店を追加するにはどうしたらいいですか?
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'});
コード:agenda.campaignId == campaignId
がTrueの場合にのみ、
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