Mongo db Node js multipuple count查询

时间:2017-01-18 12:23:11

标签: node.js mongodb

我正在使用nodejs,express和mongodb创建一个应用程序,我有以下问题。我想使用地理空间数据进行多重计数查询(例如,查找有多少文档在美国国家的边界​​内)。问题是,当我只是在最后做一个简单的for循环(对于所有状态)时,我能看到的是最后一个查询的结果,仅此而已。我意识到这是javascript工作的异步方式的问题,但我找不到解决问题的方法。我的代码现在基于我在堆栈上找到的代码看起来如下所示。请注意,statesData是一个包含美国州数据的对象。

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

1 个答案:

答案 0 :(得分:0)

您应该通过for语句更改async语句,如:

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