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

Node.jsとasync.queueを使用してMongoDBに大きなCSVを挿入する

    ストリームを含む大きなファイルを処理する必要があります。

    考えられる解決策は次のとおりです。

    var queue = async.queue(collection.insert.bind(collection), 5);
    
    csv()
    .from.path('./input.csv', { columns: true })
    .transform(function (data, index, cb) {
        queue.push(data, function (err, res) {
            if (err) return cb(err);
            cb(null, res[0]);
        });
    })
    .on('error', function (err) {
        res.send(500, err.message);
    })
    .on('end', function () {
        queue.drain = function() {
            res.send(200);
        };
    });
    

    注意:

    • node-csvのストリームAPIを使用していること 、これにより、ファイルの読み取りと同時にデータが処理されます。このようにして、ファイル全体がメモリに一度に読み取られることはありません。 transform ハンドラーはレコードごとに実行されます;
    • async.queueを使用する 、これは非同期処理キューです:最大5つのハンドラー(finalcollection.insert )は並行して実行されます。

    この例は、背圧をうまく処理できるかどうかわからないため、テストする必要があります。また、キューの同時実行レベルは、特定の構成に合わせて調整する必要があります。

    作業の要点 もここにあります。 。




    1. node-webkitを使用したDemeteorizer

    2. スキーマメソッドを使用してMongooseForループにアイテムを保存する

    3. MongoDbでjacksonを使用して日付フィールドをISODate()として保存する方法

    4. 有効なオブジェクトIDのmongodbキャストの問題でエラーが発生する