在Meteor中从对象数组中插入文档

时间:2015-11-06 13:58:15

标签: javascript node.js mongodb meteor

我有一个由多个对象组成的数组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 Name应为nameMy Age应为age等),不应该删除任何值(例如,数组中的第二个对象具有一个空值的键My Address。应该从该对象中删除键),我想要保留哪些键和其余的键应删除(例如,数组中的所有对象都应包含字段nameageaddress,并且应从每个对象中删除所有其他字段。

我想我应该使用array.map()array.filter()

我希望它能澄清我的问题。

1 个答案:

答案 0 :(得分:0)

您仍然可以使用 forEach() 方法操作数组,并且在循环中利用允许使用写入命令 Bulk API 批量插入操作的执行,它只是服务器顶部的抽象操作,可以轻松构建批量操作,从而简化inserts。这些批量操作主要有两种形式:

  • 订购批量操作。这些操作按顺序执行所有操作,并在第一次写入错误时执行错误。
  • 无序批量操作。这些操作并行执行所有操作并聚合所有错误。无序批量操作不保证执行顺序。

您可以通过上的 rawCollection rawDatabase 方法获取npm MongoDB驱动程序中的集合和数据库对象的原始访问权限Mongo.Collection 即可。例如,使用 forEach() 操作数组,构造要在循环中插入的对象,批量发送插入操作以改进写入性能,如下所示:

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