我必須爲我公司的一個客戶做一些數據處理。他們有一個大約4.7GB數據的數據庫。我需要爲使用mongo文檔的兩個屬性和外部引用計算的每個文檔添加一個字段。如何遍歷整個mongo數據庫太大而無法加載?
我的問題是,我不能做collection.find(),因爲Node.js內存不足。遍歷整個集合的最好方法是,這個集合太大而無法用一次調用來查找?
我必須爲我公司的一個客戶做一些數據處理。他們有一個大約4.7GB數據的數據庫。我需要爲使用mongo文檔的兩個屬性和外部引用計算的每個文檔添加一個字段。如何遍歷整個mongo數據庫太大而無法加載?
我的問題是,我不能做collection.find(),因爲Node.js內存不足。遍歷整個集合的最好方法是,這個集合太大而無法用一次調用來查找?
是的,有一種方法。 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);
};
好的答案,但是我問了如何在node.js中執行它,而不是在mongo控制檯中。評論中的鏈接問題有更好的答案,所以我將其標記爲重複。 – awimley
http://stackoverflow.com/questions/25507866/how-can-i-use-a-cursor-foreach-in-mongodb-using-node -js –
太棒了,我把這個標記爲重複。 – awimley