私はmongodbとbigqueryでnodejsを使用しています。nodejsループの次のインスタンスを実行するまで待機する方法
だから、bigqueryのようにコマンドごとに10kの挿入しかできないようです。
私はメインクエリをカウントし、10kからいくつのページにループしました。
私はカウントクエリで50万ページを取得します。つまり、50ページまたは500ループです。
ループの次のページを実行するまでループ待機を行う方法はありますか?
コード:
var limit = 9999;
mongo_client.connect(mongo_url, function(err, db) {
var query = {'_id.date_visited':{'$gte':'2016-01-01','$lt':'2016-02-01'}};
db.collection('my_table').count(query,function(err, count){
var pages = Math.ceil(count/limit);
console.log("count: "+count);
console.log("pages: "+pages);
for(var page=0;page<pages;page++){
var skip = page * limit;
console.log("page: "+page);
console.log("skip: "+skip);
//HOW TO MAKE THIS loop wait till running next page of the loop
db.collection('my_table').find(query).sort({'_id.date_visited':1,'_id.hour_visited':1}).limit(limit).limit(skip).toArray(function(err, db_results) {
var documents = [];
async.each(db_results, function (db_resultsx, cb) {
documents.push(db_resultsx);
if(documents.length == db_results.length) {
//console.log(documents);
bigqueryClient
.dataset(dataset)
.table('my_table')
.insert(documents)
.then((insertErrors) => {
console.log('Inserted');
//documents.forEach((row) => console.log(row));
console.error(insertErrors);
if (insertErrors && insertErrors.length > 0) {
console.log('Insert errors:');
insertErrors.forEach((err) => console.error(err));
}
})
.catch((err) => {
console.error('ERROR:');
console.log(err);
});
}
});
});
}
});
});
あなたは既に['async.each'](http://caolan.github.io/async/docs.html#each)を使用しています。この行を見る 'async.each(db_results、function(db_resultsx、cb){' 'cb'はループの次の繰り返しを通知するときに実行されることを意図しています。ステートメントを別の非同期メソッドの前に置く必要があります。そのため、非同期メソッド(bigQuery)と 'else'条件の両方で' callback 'を呼び出す必要があります。 –