2011-03-03 43 views
3

我期待學習node.js和mongodb,它們看起來適合我想要做的事情。作爲一個幫助我學習的小項目,我認爲我需要從phpbb3論壇複製「posts」表到mongodb表中,所以我做了類似這樣的事情,其中​​db是mongodb數據庫連接,client是mysql數據庫連接。通過node.js中的數據庫記錄進行迭代

db.collection('posts', function (err, data) { 
    client.query('select * from phpbb_posts", function(err, rs) { 
     data.insert(rs); 
    }); 

該工程確定,當我做小表,但我的職位表中有10多萬行,當我離開它運行了一個小時該查詢甚至不回來。我懷疑它試圖將整個數據庫表加載到內存中,然後插入它。

所以我想要做的是一次讀一大塊行並插入它們。然而,我看不到如何讀取node.js中的行的子集,甚至更多的問題,我無法理解如何通過回調獲取通知時,我可以一次遍歷查詢它已完成。

任何想法如何我最好做到這一點? (我正在尋找使用node.js的解決方案,因爲我想知道如何解決這類問題,我毫無疑問可以用其他方式輕鬆完成)

+1

兩個問題:1.你的「選擇」是否是一個錯字?我看到一個單引號和一個雙引號。 2.當你做限制10時會發生什麼?或限制1?這個過程是否至少適用於小數據集? – 2011-03-03 22:09:48

+0

對不起,我稍微簡化了查詢併發布了錯字。我可以做一個10或甚至1000的限制,這工作正常。但之後它變得越來越慢。 – jcoder 2011-03-03 22:36:12

回答

1

您可以嘗試使用caolan的asnyc library。該庫實現了一些異步流控制方法,以處理面向回調的編程風格的警告,就像它在node.js中一樣。

對於你的情況,使用whilst方法可以解決,使用針對MySQL的LIMIT查詢並將它們插入到mongodb中。

例(未測試,因爲我沒有TESTDATA可用,但我想你會明白我的意思)

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

我已經講過了,這個代碼是剛剛從異步庫的例子適應自述。但也許這是一個選項,可以將這些數據庫記錄從mysql添加到mongo。

+0

看起來很有趣,我會研究它。 – jcoder 2011-03-04 15:39:02