Javascript 在Meteor中对象数组的集合中插入文档

Javascript 在Meteor中对象数组的集合中插入文档,javascript,node.js,mongodb,meteor,Javascript,Node.js,Mongodb,Meteor,我有一个由多个对象组成的数组dataRows,例如 { 'The Name': 'John', 'My Age': 44, 'My Address': 'Some street', [...] } 我想将这些对象插入到集合中 因为我可以直接使用MyCollection.insert(object),所以我想我可以直接将对象插入到集合中;但是,问题是对象中的键的名称与集合中的字段名称不同,我不想在集合中插入所有字段 我可以这样做: dataRows.forEach( functi

我有一个由多个对象组成的数组
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',
    [...]
  },
  [...]
]
我想操纵数组,这样就可以重命名键(例如,
名称
应该是
名称
我的年龄
应该是
年龄
,等等),应该删除没有值的字段(例如,数组中的第二个对象有一个值为空的键
我的地址
。应该从此对象中删除键),我想知道应该保留哪些键,其余的键应该删除(例如,数组中的所有对象都应该有字段
名称
年龄
地址
,并且应该从每个对象中删除所有其他字段)

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


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

您仍然可以使用
forEach()操作数组
方法和循环内利用写入命令,该命令允许执行批量插入操作,这些操作只是服务器顶部的抽象,因此易于构建批量操作,从而简化了操作。这些批量操作主要有两种风格:

  • 有序大容量操作。这些操作按顺序执行所有操作,并在第一次写入错误时出错
  • 无序批量操作。这些操作并行执行所有操作并聚合所有错误。无序批量操作不保证执行顺序
您可以通过
rawCollection
rawDatabase
方法对npm MongoDB驱动程序中的集合和数据库对象进行原始访问。例如,使用
,构造要插入到循环中的对象,批量发送插入操作以提高写入性能,如下所示:

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

您仍然可以使用
forEach()操作数组
方法和循环内利用写入命令,该命令允许执行批量插入操作,这些操作只是服务器顶部的抽象,因此易于构建批量操作,从而简化了操作。这些批量操作主要有两种风格:

  • 有序大容量操作。这些操作按顺序执行所有操作,并在第一次写入错误时出错
  • 无序批量操作。这些操作并行执行所有操作并聚合所有错误。无序批量操作不保证执行顺序
您可以通过
rawCollection
rawDatabase
方法对npm MongoDB驱动程序中的集合和数据库对象进行原始访问。例如,使用
,构造要插入到循环中的对象,批量发送插入操作以提高写入性能,如下所示:

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

没有真正理解你的问题,你能澄清你想要实现什么或真正的问题是什么吗?很抱歉让人困惑。我已经编辑了我的问题。我希望现在更清楚。没有真正理解你的问题,你能澄清你想要实现什么或真正的问题是什么吗?很抱歉让人困惑的问题。我我已经编辑了我的问题。我希望现在更清楚。哇。谢谢。我会尝试一下:-执行是在forEach循环内完成的吗?执行是成批完成的,如计数器所示。正如您可以看到的,在循环内变量
计数器
是递增的,并且每1000次操作和每1000条insert语句重新初始化一次。是的,我现在看到了。对不起:-)哇。谢谢我将尝试:-执行是否在forEach循环内完成?执行是成批完成的,如计数器所示。正如您在循环中看到的,变量
计数器
是递增的,每1000个操作执行一次检查,每1000个insert语句重新初始化一次。是的,我现在看到了。对不起:-)