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

Node.jsを使用してMongodbに多くのレコードを挿入する正しい方法

    MongoDBサーバーが2.6以降の場合は、書き込みコマンドを使用することをお勧めします バルクAPI これにより、サーバー上での単純な抽象化である一括挿入操作の実行が可能になり、一括操作の構築が容易になり、大規模なコレクションに対する更新でパフォーマンスが向上します。

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

    これらの一括操作には、主に2つの種類があります。

    • 注文された一括操作 。これらの操作はすべての操作を順番に実行し、最初の書き込みエラーでエラーになります。
    • 順序付けられていない一括操作 。これらの操作は、すべての操作を並行して実行し、すべてのエラーを集約します。順序付けされていない一括操作は、実行の順序を保証するものではありません。

    2.6より古いサーバーの場合、APIは操作をダウンコンバートすることに注意してください。ただし、100%ダウンコンバートすることはできないため、正しい数値を正しく報告できないエッジケースが発生する可能性があります。

    あなたの場合、次のようにバルクAPI挿入操作を1000のバッチで実装できます。

    MongoDB3.2以降の場合 bullkWrite>

    var MongoClient = require('mongodb').MongoClient;
    var url = 'mongodb://localhost:27017/test';
    var entries = [ ... ] // a huge array containing the entry objects
    
    var createNewEntries = function(db, entries, callback) {
    
        // Get the collection and bulk api artefacts
        var collection = db.collection('entries'),          
            bulkUpdateOps = [];    
    
        entries.forEach(function(doc) {
            bulkUpdateOps.push({ "insertOne": { "document": doc } });
    
            if (bulkUpdateOps.length === 1000) {
                collection.bulkWrite(bulkUpdateOps).then(function(r) {
                    // do something with result
                });
                bulkUpdateOps = [];
            }
        })
    
        if (bulkUpdateOps.length > 0) {
            collection.bulkWrite(bulkUpdateOps).then(function(r) {
                // do something with result
            });
        }
    };
    

    MongoDB <3.2の場合

    var MongoClient = require('mongodb').MongoClient;
    var url = 'mongodb://localhost:27017/test';
    var entries = [ ... ] // a huge array containing the entry objects
    
    var createNewEntries = function(db, entries, callback) {
    
        // Get the collection and bulk api artefacts
        var collection = db.collection('entries'),          
            bulk = collection.initializeOrderedBulkOp(), // Initialize the Ordered Batch
            counter = 0;    
    
        // Execute the forEach method, triggers for each entry in the array
        entries.forEach(function(obj) {         
    
            bulk.insert(obj);           
            counter++;
    
            if (counter % 1000 == 0 ) {
                // Execute the operation
                bulk.execute(function(err, result) {  
                    // re-initialise batch operation           
                    bulk = collection.initializeOrderedBulkOp();
                    callback();
                });
            }
        });             
    
        if (counter % 1000 != 0 ){
            bulk.execute(function(err, result) {
                // do something with result 
                callback();             
            }); 
        } 
    };
    

    createNewEntries()を呼び出します 機能。

    MongoClient.connect(url, function(err, db) {
        createNewEntries(db, entries, function() {
            db.close();
        });
    });
    


    1. キーが存在する場合はHSET

    2. JongoとMongoDBを使用したjackson逆シリアル化でObjectId_idの名前をidに変更します

    3. Mongodエラー(自作でインストール)

    4. コレクションを分割する場合のMongoDB(noSQL)