【发布时间】:2017-05-30 12:49:20
【问题描述】:
我将 nodejs 与 mongodb 和 bigquery 一起使用。
所以因为似乎 bigquery 每个命令只允许 10k 插入。
所以我计算了主查询,并从 10k 循环到多少页。
计数查询得到 500k,因此 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。请参阅此行async.each(db_results, function (db_resultsx, cb) {cb旨在在您想要发出循环的下一次迭代信号时执行。请小心,因为您在另一个异步方法之前有一个if语句,因此您应该在异步方法( bigQuery )的完成内以及需要配对的else条件中调用该“回调”if,否则我们不会发出继续循环的信号。
标签: node.js mongodb google-bigquery async.js