2016-11-25 11 views
0

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); 
     }) 

    }) 
} 
+0

あなたはアジェンダの> 1要素があなたの望むものと同じになっているショップのみを返すリクエストを作成しようとしましたか? MongoDBは多くの時間を楽にすることができます – DrakaSAN

答えて

2

問題がshopCompleteコールバックと呼ばれますされています。 if blockの外に電話する必要があります。

+0

うん!それがトリックでした! – NVO

+0

また、async.eachSeries(shop.agenda、function(agenda、shopComplete){'の代わりにシンクループを実行するNVOを提案すると、そこに非同期が必要な理由がわかりません。 –

関連する問題