2015-11-06 63 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