MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Inserindo grandes CSVs no MongoDB com Node.js e async.queue


Você deve lidar com um arquivo grande com fluxos.

Aqui está uma possível solução:
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);
    };
});

Observe:
  • que usamos a API de stream de node-csv , que garante que os dados sejam processados ​​ao mesmo tempo em que o arquivo é lido:dessa forma, o arquivo inteiro não é lido na memória de uma só vez. A transform manipulador é executado para cada registro;
  • que usamos async.queue , que é uma fila de processamento assíncrona:no máximo 5 manipuladores (finalcollection.insert ) são executados em paralelo.

Este exemplo deve ser testado, pois não tenho certeza se ele lida muito bem com a pressão de retorno. Além disso, o nível de simultaneidade da fila deve ser ajustado à sua configuração específica.

Você também pode encontrar um gist de trabalho aqui .