2015-10-08 50 views
2

我必須爲我公司的一個客戶做一些數據處理。他們有一個大約4.7GB數據的數據庫。我需要爲使用mongo文檔的兩個屬性和外部引用計算的每個文檔添加一個字段。如何遍歷整個mongo數據庫太大而無法加載?

我的問題是,我不能做collection.find(),因爲Node.js內存不足。遍歷整個集合的最好方法是,這個集合太大而無法用一次調用來查找?

+1

http://stackoverflow.com/questions/25507866/how-can-i-use-a-cursor-foreach-in-mongodb-using-node -js –

+0

太棒了,我把這個標記爲重複。 – awimley

回答

3

是的,有一種方法。 Mongo旨在處理大型數據集。

您可能內存不足,不是因爲db.collection.find(),而是因爲您試圖一次性將其全部轉儲爲db.collection.find().toArray()之類的東西。

對大於內存的結果集進行操作的正確方法是使用遊標。這裏是你會怎麼做,在蒙戈控制檯:

var outsidevars = { 
    "z": 5 
}; 

var manipulator = function(document,outsidevars) { 
    var newfield = document.x + document.y + outsidevars.z; 
    document.newField = newfield; 
    return document; 
}; 

var cursor = db.collection.find(); 

while (cursor.hasNext()) { 
    // load only one document from the resultset into memory 
    var thisdoc = cursor.getNext(); 
    var newnoc = manipulator(thisdoc,outsidevars); 
    d.collection.update({"_id": thisdoc['_id']},newdoc); 
}; 
+0

好的答案,但是我問了如何在node.js中執行它,而不是在mongo控制檯中。評論中的鏈接問題有更好的答案,所以我將其標記爲重複。 – awimley