我试图将数千条记录导入Meteor集合中的嵌套数组中。这是来自JSON对象的财务数据。我需要在插入它之前对它进行一些计算,所以不能那样做。为每次写入执行$ addToSet操作非常非常慢。有没有办法在一次通话中推送完整的数据集?
我的架构看起来像这样。
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多条记录。我看过https://atmospherejs.com/udondan/bulk-collection-update和https://atmospherejs.com/mikowals/batch-insert,但它们似乎并没有完全符合我的要求。理想情况下,我会有一个解决方案,我可以在收集它们时批量添加新记录。
答案 0 :(得分:0)
您可以使用阵列上的 forEach()
方法更新集合,并在循环内利用写入命令批量API,允许执行批量更新操作简单地在服务器顶部进行抽象,以便轻松构建批量操作。这些批量操作主要有两种形式:
注意,对于比2.6更旧的服务器,API将下转换操作。但是,不可能将100%下转换,因此可能存在一些无法正确报告正确数字的边缘情况。您可以通过rawCollection
rawDatabase
和Mongo.Collection
方法获取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
});
}
}
});
});
}