2

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 在下一个版本中支持这个吗?

4

3 回答 3

4

您可以使用 exec ( nodejs docsMeteor.startup )在服务器上的流星内运行 mongo 脚本。

例子:

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

不是最佳的,但我认为这是你目前最好的选择。您还可以--eval在 exec 中对 Mongo 使用命令行选项,并将插入语句作为字符串传递给 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
    });        
});
于 2013-11-07T18:10:53.697 回答
3

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

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

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

然后,您可以在 forEach 循环之前停用所有反应式重新渲染,然后再重新激活它(Session.set("active", false))。

于 2013-11-04T00:38:51.797 回答
0

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

await Orders.rawCollection().insertMany(arrOfOrders)

就我而言,它适用于 70M 数据。(await 使其同步,因此您应该考虑是否将其用于您的目的。)

于 2020-11-27T21:53:39.340 回答