2015-11-06 101 views
1

我有一個由多個對象組成的數組dataRows,例如,從流星中的對象陣列中插入文檔

{ 
    'The Name': 'John', 
    'My Age': 44, 
    'My Address': 'Some street', 
    [...] 
} 

我想插入這些對象到一個集合中。

因爲我可以只使用MyCollection.insert(object),我想我可以直接將對象插入集合;不過,問題在於我的對象中的鍵與我的集合中的字段名稱命名方式不同,我不想在我的集合中插入所有字段。

我可能只是這樣做:

dataRows.forEach(function (row) { 
    MyCollection.insert({ 
    name: row['The Name'], 
    age: row['My Age'], 
    address: row['My Address'], 
    }); 
}) 

但我認爲它會更好,如果我能直接操作數組dataRows

此外,我不想跳過空值的字段。

編輯

我有一個數組

[ 
    { 
    'The Name': 'John', 
    'My Age': 44, 
    'My Address': 'Some street', 
    [...] 
    }, 
    { 
    'The Name': 'Michael', 
    'My Age': 57, 
    'My Address': '', 
    [...] 
    }, 
    { 
    'The Name': 'Anne', 
    'My Age': 31, 
    'My Address': 'Some other street', 
    [...] 
    }, 
    [...] 
] 

我要處理的陣列,所以鍵可以被重命名(例如The NamenameMy Ageage等),田野不應該刪除任何值(例如,數組中的第二個對象具有空值的鍵My Address,該鍵應該從該對象中移除),並且我希望保留哪些鍵以及其餘鍵應該被刪除(例如,陣列中的所有對象都應該有對象ds name,age,address和所有其他字段應從每個對象中刪除。

我想我應該用array.map()array.filter()

我希望澄清我的問題。

+0

不是真的讓你的問題在這裏,你能不能請澄清你想達到的目標或真正的問題是什麼? – chridam

+0

對不起,這個令人困惑的問題。我編輯了我的問題。我希望現在更清楚。 – Jamgreen

回答

0

仍然可以使用forEach()方法操縱陣列和環內採取使用寫的優點命令Bulk API,其允許大容量插入操作,這些操作是簡單地在服務器的頂部的抽象使執行很容易構建批量操作,從而簡化您的inserts。這些批量業務主要有兩種口味:

  • 有序批量操作。這些操作按順序執行所有操作,並在第一次寫入錯誤時出錯。
  • 無序批量操作。這些操作並行執行所有操作並彙總所有錯誤。無序批量操作不保證執行順序。

您可以通過rawCollectionrawDatabase方法得到Mongo.Collection在故宮的MongoDB驅動程序收集和數據庫對象的原始訪問。例如,操作使用forEach()數組,構造對象,要在循環內插入,發送批量插入操作改進寫perfomances如下:

MyCollection = new Meteor.Collection("mycollection"); 

if (Meteor.isServer) { 
    Meteor.startup(function() { 
     Meteor.methods({ 
      insertData: function() { 
       var bulkOp = MyCollection.rawCollection().initializeUnorderedBulkOp(), 
        counter = 0, 
        dataRows = [...]; // the raw array 

       dataRows.forEach(function(row) { 
        var data = { 
         name: row['The Name'], 
         age: row['My Age'], 
         address: row['My Address'], 
        }; 
        bulkOp.insert(data); 

        counter++; 
        if (counter % 1000 == 0) { 
         // Execute per 1000 operations and re-initialize every 1000 update statements 
         bulkOp.execute(function(e, rresult) { 
          // do something with result 
         }); 
         bulkOp = MyCollection.rawCollection().initializeUnorderedBulkOp(); 
        } 
       }); 

       // Clean up queues 
       if (counter % 1000 != 0){ 
        bulkOp.execute(function(e, result) { 
         // do something with result 
        }); 
       } 
      } 
     }); 
    }); 
} 
+0

哇。謝謝。我會試試看:-D – Jamgreen

+0

它是否打算在forEach循環內完成執行? – Jamgreen

+0

如計數器所示,執行是分批完成的。正如你在循環中看到的那樣,變量'counter'遞增,並且每1000次操作執行一次檢查並重新初始化每1000個插入語句。 – chridam