我正在使用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);
});
}
答案 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);
}
});