sql >> データベース >  >> NoSQL >> MongoDB

MongoDBのバルクパフォーマンスを改善するにはどうすればよいですか?

    一括挿入操作をバッチで送信します。これにより、サーバーへのトラフィックが減少し、すべてを個別のステートメントで送信するのではなく、サーバーのコミットメントのために管理可能なチャンクに分割することで、効率的なワイヤートランザクションを実行します。このアプローチでは、コールバックでの応答を待つ時間も短縮されます。

    これを使用するより良いアプローチは、 async を使用することです。 モジュールなので、入力リストをループすることも非ブロッキング操作です。バッチサイズの選択はさまざまですが、1000エントリごとにバッチ挿入操作を選択すると、「リクエスト」全体が1つのBSONドキュメントに等しいため、16MBのBSONハード制限を安全に下回ることができます。

    以下は、 async の使用方法を示しています。 モジュールは、配列を反復処理し、反復関数を繰り返し呼び出しますが、testはtrueを返します。停止したとき、またはエラーが発生したときにコールバックを呼び出します。

    var bulk = col.initializeOrderedBulkOp(),
        counter = 0,
        len = array.length,
        buildModel = function(index){   
            return {
                "data": array[index],
                "metaData": {
                    "hash": hash,
                    "date": timestamp,
                    "name": name
                }
            }
        };
    
    async.whilst(
        // Iterator condition
        function() { return counter < len },
    
        // Do this in the iterator
        function (callback) {
            counter++;
            var model = buildModel(counter);
            bulk.insert(model);
    
            if (counter % 1000 == 0) {
                bulk.execute(function(err, result) {
                    bulk = col.initializeOrderedBulkOp();
                    callback(err);
                });
            } else {
                callback();
            }
        },
    
        // When all is done
        function(err) {
            if (counter % 1000 != 0) {
                bulk.execute(function(err, result) {
                    console.log("More inserts.");
                }); 
            }           
            console.log("All done now!");
        }
    );
    



    1. Nodejs Mongoose-コールバック地獄を回避する方法は?

    2. docker-composeを使用してmongoデータベースをシードするにはどうすればよいですか?

    3. 16進文字列をmongodbの数値にどのように変換しますか?

    4. Java Mongo DBドライバーバージョン3を使用してBasicDBObjectをMongoドキュメントに変換するにはどうすればよいですか?