2017-01-18 8 views
0

私はnodejs、express、mongodbでアプリを作っていますが、次の問題があります。地理空間データを使用して複数の集計クエリを作成する必要があります(たとえば、米国の州の境界内にあるドキュメントの数を調べるなど)。問題は、単純なforループ(すべての状態に対して)を最後に行っているときに、私が見ることができるのは最後のクエリの結果であり、それ以上はないということです。私はこれが非同期の方法JavaScriptの作品の問題だが、私は問題を解決する方法を見つけることができないことに気づいた。私のコードは、スタック上で見つかったコードに基づいて次のようになります。 statesDataはusa状態データを含むオブジェクトです。Mongo dbノードjs multipuple countクエリ

for(var i=0; i<51; i++){ 
    increment = function(request, callback) { 
     var MongoClient = require('mongodb').MongoClient, 
      format = require('util').format; 
     MongoClient.connect('mongodb://localhost/DBNAME', function(err, db) { 
      if (err) throw err; 
      var collection = db.collection('ColName'); 
      collection.count({PLACE: { 
       $geoWithin: { 
        $geometry: { 
        type : statesData.features[i].geometry.type , 
        coordinates: statesData.features[i].geometry.coordinates, 
        } 
       } 
      } 
      }, function(err, count) { 
       if (err) throw err;          
       db.close(); 

       console.log("docs count: " + count);  
       callback(null, count); 
      });  
     });     
    }; 

    increment({}, function(err, count) { 
     console.log(count); 
    }); 
} 
+0

ザ・はすなわち、それは非同期ではありませんが、ブロックしています。非同期的なループのバージョンが必要です。Node.js 'async'モジュールを試してください: 'http:// caolan.github.io/async/docs.html#whilst'、すなわち' var count = 0; async.whilst( function(){return count <51;}、 関数(コールバック){...}) ' – chridam

答えて

0

あなたが好きasync文でごforステートメントを変更する必要があります:forループ

var async = require('async'); 
var i = 0; 
var counts = []; 

async.whilst(
    function() { 
     return i < 51; 
    }, 
    function (callback) { 
     i++; 

     var MongoClient = require('mongodb').MongoClient; 
     var format = require('util').format; 

     MongoClient.connect('mongodb://localhost/DBNAME', function(err, db) { 
      if (err) throw err; 

      var collection = db.collection('ColName'); 

      collection.count({ 
       PLACE: { 
        $geoWithin: { 
         $geometry: { 
          type : statesData.features[i].geometry.type , 
          coordinates: statesData.features[i].geometry.coordinates, 
         } 
        } 
       } 
      }, function(err, count) { 
       if (err) throw err;  

       db.close(); 

       console.log("docs count: " + count);  

       // you shouyld save your count value in a clojure var like : 
       counts.push(count); 

       callback(null, i); 
      });  
     });    
    }, 
    function() { 
     // final callback 

     // here, you should launch the final callback to get all counts values 
     console.log(counts); 
    } 
});