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 docs ) を使用して、サーバー上の流星内で mongo スクリプトを実行Meteor.startupできます。

例:

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
    });        
});
于 2013-11-07T18:10:53.697 に答える
3

forEach ループなどで大量のデータを DB に挿入する場合、それに依存するリアクティブなコンテンツがページにないことを確認する必要があります。そうしないと、リアクティブな再レンダリングによってクライアントの速度が大幅に低下します。すべてのテンプレートが無効になっている場合は、数千のドキュメントをコレクションに簡単に挿入できますが、関連する反応が発生している場合、クライアントとサーバーの両方で CPU が 100% の場合、同じ操作に数分かかることがあります。

次のように、コンテンツがこのデータに依存するテンプレートに条件を追加することができます。

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

次に、forEach ループの前にすべてのリアクティブな再レンダリングを無効にし、後で再度有効にすることができます (Session.set("active", false))。

于 2013-11-04T00:38:51.797 に答える