Actualmente estoy trabajando en un proyecto en el que tengo que leer un archivo .csv grande y cargar su contenido en una colección de MongoDB. Para leer los archivos CSV, estoy usando el módulo @fast-csv/parse npm. Además, estoy usando la API de transmisión de node js para pausar la transmisión e insertar 200 documentos por lote en una colección de MongoDB. Después de eso, retomo la transmisión. Aquí está el código.
module.exports.seedProductCollection = (filepath) => new Promise((resolve, reject) => { let documents = []; let counter = 0; const stream = fs.createReadStream(filepath); stream.pipe(csv.parse({ headers: true })) .on('error', (error) => reject(error)) .on('data', async (row) => { if (documents.length >= 200) { stream.pause(); try { documents.push(row); await db.Product.insertMany(documents); counter += documents.length; console.log('counter: ', counter); documents = []; stream.resume(); } catch (error) { reject(error); } } else { documents.push(row); } }) .on('end', async () => { if (documents.length > 0) { try { await db.Product.insertMany(documents); counter += documents.length; } catch (error) { reject(error); } } resolve(counter); }); }); Entonces, básicamente, creé un readStream desde el archivo .csv e inserté cada fila del archivo .csv como un objeto JavaSCript en la matriz de documentos. Cuando la matriz de documentos tiene 200 objetos, pausé la transmisión usando stream.pause() . Luego, inserte estos 200 objetos en una colección MongoDB y luego reanude nuevamente la transmisión usando stream.resume() . Además, asignando a la matriz de documentos una matriz vacía documents = [] . Una vez finalizada la transmisión de lectura, en el detector de eventos stream.on('end'), verifico si hay más objetos en la matriz de documentos y, si tiene alguno, los inserto nuevamente en la colección. Ahora, el problema es que, cuando verifico la colección en MongoDB, noté que después de cada 200 documentos, los documentos se repiten nuevamente de esta manera.
{ id: 1, name: 'product1', description: 'this is product1' }, { id: 2, name: 'product2', description: 'this is product2' }, ..... { id: 200, name: 'product200', description: 'this is product200' }, { id: 1, name: 'product1', description: 'this is product1' }, { id: 2, name: 'product2', description: 'this is product2' },Como puede ver, después de productId 200, los documentos se repiten nuevamente y las secuencias ingresan en un bucle infinito. Si cambio la longitud de la matriz de documentos de 200 a 100, sucede después de cada 100 elementos. Estoy realmente atascado en este punto. Intenté un par de cosas, pero nada funcionó. Cualquier ayuda sería muy apreciada. Gracias por adelantado.