2015-06-30 59 views
1

我需要在Meteor中一次创建2000个文档。我知道我可以使用批量创建流星

for (i=0; i<2000; i++) { 
    CollectionName.insert({}); 
} 

但我希望Meteor有一个批量创建功能。我怎样才能以最快的方式插入这2000行?

+0

工作,你的方法是正确的语法。如果你想要一个批量然后看 http://stackoverflow.com/questions/19757434/bulk-mongodb-insert-in-meteor-or-node –

+0

看看这个:http://www.markdrew.co .uk/blog/post.cfm/imports-json-into-a-meteor-mongo-database – Billybobbonnet

回答

7

流星本身并不支持这一点。但是,它可以让您访问可以本地执行批量插入的节点Mongodb驱动程序。

你只能做到这一点的服务器上:

var x = new Mongo.Collection("xxx"); 

x.rawCollection.insert([doc1, doc2, doc3...], function(err, result) { 
    console.log(err, result) 
}); 

或用MongoDB的2.6,如果您的流星实例访问它:

var bulk = x.initializeUnorderedBulkOp(); 

bulk.insert({ _id: 1, item: "abc123", status: "A", soldQty: 5000 }); 
bulk.insert({ _id: 2, item: "abc456", status: "A", soldQty: 150 }); 
bulk.insert({ _id: 3, item: "abc789", status: "P", soldQty: 0 }); 
bulk.execute({ w: "majority", wtimeout: 5000 }); 

注:

  • 这是不是同步的,也不是在光纤中运行,因为它使用原始节点驱动程序。您需要使用Meteor.bindEnvironment或Meteor.wrapAsync创建同步代码
  • 文档被无序插入,并且可能不是您添加它们的原始顺序。
  • 流星可能需要10秒才能看到文档如果您的实例未启用oplog,则通过发布方法'Reactively'。
1

下面是我用什么:

/server/fixtures.js

var insertIntoCollection = function(collection, dataArray){ 
    dataArray.forEach(function(item){ 
    collection.insert(item); 
    }); 
}; 

if (Stuff.find().count() === 0) { 

    var array = [ 
    { 
     // document1 
    },{ 
     // document2 
    } 
    ]; 

    insertIntoCollection(Stuff, array); 
}; 
+0

简单的解决方案。 Meteor 1.4将使用Mongo 3.2和Bulk Insert。如果您没有10,000个文档,此解决方案将非常好地工作。 – TheBetterJORT

4

扩展@ Akshat的答案,这是将在流星1.0+

x = new Mongo.Collection("x"); 
var bulk = x.rawCollection().initializeUnorderedBulkOp(); 

bulk.insert({ _id: 1, item: "abc123", status: "A", soldQty: 5000 }); 
bulk.insert({ _id: 2, item: "abc456", status: "A", soldQty: 150 }); 
bulk.insert({ _id: 3, item: "abc789", status: "P", soldQty: 0 }); 

Meteor.wrapAsync(bulk.execute)(); 
+0

有一件事让我绊倒了:如果你有ObjectID试图插入,你需要将它们转换为Node的ObjectID表示,而不是Meteor的插入到原始集合中时.'MongoInternals.NpmModule.ObjectID(your_obj_id。 _STR);' – vroomfondel