簡體   English   中英

在 Meteor 或 Node 中批量插入 mongodb

[英]Bulk mongodb insert in Meteor or Node

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 會在下一個版本中支持這個嗎?

您可以使用 exec ( nodejs docs )在服務器上的Meteor.startup內的Meteor.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
    });        
});

不是最佳選擇,但我認為這是您目前最好的選擇。 您還可以在 exec 中對 Mongo 使用命令行選項--eval並將插入語句作為字符串傳遞給 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
    });        
});

當向數據庫中插入大量數據時,例如在 forEach 循環中,您需要確保頁面上沒有依賴於它的反應性內容。 否則,反應式重新渲染會極大地減慢您的客戶端的速度。 當所有模板都被禁用時,您可以在幾分之一秒內輕松地將數千個文檔插入到一個集合中,而如果發生相關反應,則相同的操作可能需要幾分鍾時間,並且客戶端和服務器上的 CPU 均處於 100%。

您可能希望向其內容取決於此數據的任何模板添加條件,例如:

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

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

您可以使用 rawCollection,它是 Meteor.Collection 中的節點 mongodb 驅動程序實現。

await Orders.rawCollection().insertMany(arrOfOrders)

就我而言,它適用於 70M 數據。 (await 使其同步,因此您應該考慮是否出於您的目的使用它。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM