我有一个由多个对象组成的数组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
应为name
,My Age
应为age
等),不应该删除任何值(例如,数组中的第二个对象具有一个空值的键My Address
。应该从该对象中删除键),我想要保留哪些键和其余的键应删除(例如,数组中的所有对象都应包含字段name
,age
,address
,并且应从每个对象中删除所有其他字段。
我想我应该使用array.map()
,array.filter()
等
我希望它能澄清我的问题。
答案 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
});
}
}
});
});
}