Tengo una colección que contiene más de 5 millones de registros. Necesito consultar y pasar los datos al cliente como un archivo csv. Inicialmente, cuando los registros solían ser bajos, simplemente lo hicimos en bucle y lo escribimos en un archivo y lo enviamos al cliente. Pero ahora que el registro sigue creciendo, consume memoria y nos enfrentamos a un problema. Entonces, para usar la transmisión, probé a continuación,
const cursor = Model.find(query) const transformer = (doc) => { return { "Creator": doc.Entity_Creator, "Action Date" : doc.E_Approve_Time, "Remarks": doc.Entity_Comment } } let pat = path.join(__dirname, '../') var csvFilePath = '././downloads/' + ' Approved.csv' const filename = pat + csvFilePath res.setHeader('Content-disposition',`attachment;filename=${filename}`); res.writeHead(200,{ 'Content-Type': 'text/csv'}) res.flushHeaders(); var csvStream = fastCsv.format({headers: true}).transform(transformer) cursor.stream().pipe(csvStream).pipe(res)Pero después de la descarga, obtengo archivos con Object Object en una sola columna. Cómo resolver este problema?
utilizar este
const transformer = (doc) => { return { Creator: doc.Entity_Creator, "Action Date": doc.E_Approve_Time, Remarks: doc.Entity_Comment, }; }; let pat = path.join(__dirname, "../"); var csvFilePath = "././downloads/" + " Approved.csv"; const filename = pat + csvFilePath; res.setHeader("Content-disposition", `attachment;filename=${filename}`); res.writeHead(200, { "Content-Type": "text/csv" }); res.flushHeaders(); var csvStream = fastCsv.format({ headers: true }).transform(transformer); csvStream.pipe(process.stdout).on("end", () => process.exit()); Model.find(query).exec(function (err, cursor) { if (err) { console.log(err); console.log('error returned'); return false; } if (!data) { console.log('Authentication Failed'); return false; } cursor.forEach((e) => { csvStream.write({ Creator: e.Entity_Creator, "Action Date": e.E_Approve_Time, Remarks: e.Entity_Comment, }); }); }) csvStream.end();