批量mongodb插入流星或节点

时间:2013-11-03 20:02:45

标签: node.js mongodb meteor

MongoDB支持批量插入http://docs.mongodb.org/manual/core/bulk-inserts/

我在Meteor系列中尝试过它:

Orders.insert([
    { "cust_id" : "A123", "amount" : 500, "status" : "A", "_id" : "iZXL7ewBDALpic8Fj" },
    { "cust_id" : "A123", "amount" : 250, "status" : "A", "_id" : "zNrdBAxxeNZQ2yrL9" },
    { "cust_id" : "B212", "amount" : 200, "status" : "A", "_id" : "vev3pjJ8cmiDHHxe4" },
    { "cust_id" : "A123", "amount" : 300, "status" : "D", "_id" : "BBLngRhS76DgeHJQJ" }
]);

但它只会创建

{ "0" : { "cust_id" : "A123", "amount" : 500, "status" : "A", "_id" : "iZXL7ewBDALpic8Fj"},
"1" : { "cust_id" : "A123", "amount" : 250, "status" : "A", "_id" : "zNrdBAxxeNZQ2yrL9" }, 
"2" : { "cust_id" : "B212", "amount" : 200, "status" : "A", "_id" : "vev3pjJ8cmiDHHxe4" }, 
"3" : { "cust_id" : "A123", "amount" : 300, "status" : "D", "_id" : "BBLngRhS76DgeHJQJ" }, 
"_id" : "6zWayeGtQCdfS65Tz" }

我需要它用于性能测试目的。我需要用数千个测试项填充和测试数据库。我在foreach中插入,但填充数据库需要很长时间。

这里有解决方法吗?或者我们可以期待Meteor在下一版本中支持这个吗?

3 个答案:

答案 0 :(得分:4)

您可以使用exec(nodejs docs)在服务器上Meteor.startup内的meteor内部运行mongo脚本。

示例:

Meteor.startup(function () {
    var exec = Npm.require('child_process').exec;
    exec('mongo localhost:27017/meteor path-to/my-insert-script.js', function ( ) {
       // done
    });        
});

不是最佳,但我认为这是你现在最好的选择。您还可以在exec中对Mongo使用命令行选项--eval,并将insert语句作为字符串传递给exec。这可能是这样的:

Meteor.startup(function () {
    var exec = Npm.require('child_process').exec;
    exec('mongo localhost:27017/meteor --eval \'db.Orders.insert(' + JSON.stringify(arrOfOrders) + ')\'', function ( ) {
       // done
    });        
});

答案 1 :(得分:3)

将大量数据插入数据库时​​,例如,在forEach循环中,您需要确保页面上没有依赖于它的被动内容。否则,反应性重新渲染将极大地降低客户的速度。当所有模板都被禁用时,您可以在几分之一秒内轻松地将数千个文档插入到集合中,而如果发生相关的反应,则在客户端作为服务器时,相同的操作可能需要几分钟,CPU为100%。

您可能希望向内容依赖于此数据的任何模板添加条件,例如:

Template.myTemplate.items = function() {
  if (Session.get("active")) {
      return Order.find();
  }
}

然后你可以在forEach循环之前停用所有被动重新渲染,然后再重新激活它(Session.set(“active”,false))。

答案 2 :(得分:0)

您可以使用rawCollection,它是Meteor.Collection中的节点mongodb驱动程序实现。

await Orders.rawCollection().insertMany(arrOfOrders)

在我的情况下,它可以处理70M数据。 (等待使其同步,因此您应该考虑是否出于自己的目的使用它。)