Javascript 在Meteor中-如何将大容量插入嵌套数组
我正在尝试将数千条记录导入Meteor集合中的嵌套数组中。这是JSON对象中的财务数据。我需要做一些计算,然后再插入它,所以不能这样做。对每次写入执行$addToSet操作非常非常慢。有没有办法在一次呼叫中推送完整的数据集 我的模式看起来像这样Javascript 在Meteor中-如何将大容量插入嵌套数组,javascript,arrays,mongodb,meteor,Javascript,Arrays,Mongodb,Meteor,我正在尝试将数千条记录导入Meteor集合中的嵌套数组中。这是JSON对象中的财务数据。我需要做一些计算,然后再插入它,所以不能这样做。对每次写入执行$addToSet操作非常非常慢。有没有办法在一次呼叫中推送完整的数据集 我的模式看起来像这样 NestedSchema = new SimpleSchema({ item: { type: String }, aThing: { type: Number } }); MasterSchema = new S
NestedSchema = new SimpleSchema({
item: {
type: String
},
aThing: {
type: Number
}
});
MasterSchema = new SimpleSchema({
symbol: {
type: String,
label: 'Symbol',
unique: true
},
data: {
type: [NestedSchema],
optional: true
}
});
我有一堆这样的数据,我想插入
var dataToInsert = [{item: "thing", aThing: 1}, {item: "thing2", aThing: 2}, {item: "thing3", aThing: 2}];
我试图插入嵌套数组的数据是5000多条记录。我已经看过了,但它们似乎并没有完全符合我的要求。理想情况下,我会有一个解决方案,可以在收集新记录时批量追加它们。您可以使用
forEach()更新收集
方法在数组上和循环内利用write命令Bulk API,该API允许执行批量更新操作,这些操作只是服务器顶部的抽象,以便轻松构建批量操作。这些批量操作主要有两种口味:
- 有序大容量操作。这些操作按顺序执行所有操作,并在第一次写入错误时出错
- 无序批量操作。这些操作并行执行所有操作,并汇总所有错误。无序的批量操作不能保证执行顺序
Mongo.collection
上的rawCollection
和rawDatabase
方法获得对npm MongoDB驱动程序中集合和数据库对象的原始访问权
MyCollection = new Meteor.Collection("mycollection");
if (Meteor.isServer) {
Meteor.startup(function () {
Meteor.methods({
insertData: function(symbol) {
var bulkOp = MyCollection.rawCollection().initializeUnorderedBulkOp(),
counter = 0,
dataToInsert = [...];
dataToInsert.forEach(function(data) {
bulkOp.find({"symbol": symbol}).updateOne({ "$addToSet": data });
counter++;
if (counter % 1000 == 0) {
// Execute per 1000 operations and re-initialize every 1000 update statements
bulkOp.execute(function(e, result) {
// do something with result
console.info('result.nMatched', result.nMatched, 'result.nModified', result.nModified);
});
bulkOp = MyCollection.rawCollection().initializeUnorderedBulkOp();
}
});
// Clean up queues
if (counter % 1000 != 0){
bulkOp.execute(function(e, result) {
// do something with result
});
}
}
});
});
}
您是否使用
$addToSet
来避免重复?如果没有重复,那么只需$push
,应该会快得多。或者你能在内存中创建整个数组,然后一次性插入吗?@user3225576不用担心,很乐意帮助:)