Mongodb 遍历node.js中的数据库记录
我希望学习node.js和mongodb,它们看起来适合我想要制作的东西。作为一个帮助我学习的小项目,我想我应该将phpbb3论坛中的“posts”表复制到mongodb表中,所以我做了类似的事情,其中db是mongodb数据库连接,client是mysql数据库连接Mongodb 遍历node.js中的数据库记录,mongodb,node.js,Mongodb,Node.js,我希望学习node.js和mongodb,它们看起来适合我想要制作的东西。作为一个帮助我学习的小项目,我想我应该将phpbb3论坛中的“posts”表复制到mongodb表中,所以我做了类似的事情,其中db是mongodb数据库连接,client是mysql数据库连接 db.collection('posts', function (err, data) { client.query('select * from phpbb_posts", function(err, rs) {
db.collection('posts', function (err, data) {
client.query('select * from phpbb_posts", function(err, rs) {
data.insert(rs);
});
当我在小表上执行此操作时,它可以正常工作,但我的posts表中有大约100000行,即使我让它运行一小时,此查询也不会返回。我怀疑它试图将整个数据库表加载到内存中,然后插入它
所以我想做的是一次读取一大块行并插入它们。然而,我看不到如何读取node.js中的行子集,更严重的问题是,我不明白当我只通过回调收到完成通知时,如何一次迭代一个查询
你知道我怎样才能做到最好吗?(我正在寻找使用node.js的解决方案,因为我想知道如何解决这类问题,毫无疑问,我可以用其他方法轻松地解决)您可以尝试使用曹兰的。该库实现了一些异步流控制方法,以处理node.js中面向回调编程风格的警告
对于您的情况,使用while
方法可以解决问题,对mysql使用限制查询并将其插入mongodb
示例(未测试,因为我没有可用的测试数据,但我想你会明白的)
var insertCount=0;
var偏移=0;
//将其设置为mysql中的整体recordcound
var-recordCount=0;
异步的(
//测试条件回调
函数(){return insertCount
正如我已经提到的,这段代码只是根据异步库自述的一个示例改编而成。但也许这是一种将如此多的数据库记录从mysql添加到mongo的选择。两个问题:1。你的“选择”中有错吗?我看到一个单引号和一个双引号。2.当你限制10时会发生什么?还是限制1?这个过程至少对小数据集有效吗?是的,对不起,我稍微简化了发布的查询,并输入了一个错误。我可以做一个限制10甚至1000,这是正常的。但在那之后,它变得越来越慢。这看起来很有趣,我会研究它。
var insertCount = 0;
var offset = 0;
// set this to the overall recordcound from mysql
var recordCount = 0;
async.whilst(
// test condition callback
function () { return insertCount < recordCount; },
// actual worker callback
function (callback) {
db.collection('posts', function (err, data) {
client.query('select * from phpbb_posts LIMIT ' + insertCount + ',1000', function(err, rs) {
data.insert(rs);
// increment by actually fetched recordcount (res.length?)
insertCount += res.length;
// trigger flow callback
callback();
});
});
},
// finished callback
function (err) {
// finished inserting data, maybe check record count in mongodb here
}
});