Suppose a student collection in mongoDB have some data that we want to export in a CSV file from a Mongoose, Node, and Express app. For simplicity, let us assume only two fields in Mongoose schema: lastName and firstName. To export a CSV file, install moment, json2csv, and mongo-date-query (optional) npm packages:
npm install moment json2csv mongo-date-query --save
The required code is as follows:
"use strict";
const fs = require("fs");
const moment = require("moment");
const mdq = require("mongo-date-query");
const json2csv = require("json2csv").parse;
const path = require("path");
const fields = ["firstName", "lastName"];
const Student = require("./student");
router.get("/", function (req, res) {
Student.find({ createdAt: mdq.lastYear() }, function (err, students) {
if (err) {
return res.status(500).json({ err });
} else {
let csv;
try {
csv = json2csv(students, { fields });
} catch (err) {
return res.status(500).json({ err });
}
const dateTime = moment().format("YYYYMMDDhhmmss");
const filePath = path.join(
__dirname,
"..",
"public",
"exports",
"csv-" + dateTime + ".csv"
);
fs.writeFile(filePath, csv, function (err) {
if (err) {
return res.json(err).status(500);
} else {
setTimeout(function () {
fs.unlinkSync(filePath); // delete this file after 30 seconds
}, 30000);
return res.json("/exports/csv-" + dateTime + ".csv");
}
});
}
});
});
The breakdown of above code is:
-
Require
fs
to write file in export directory,moment
to give a unique name to the file,json2csv
to convert json to csv format,path
to find exact path of directory for file temporary storage andStudent
Mongoose model -
Define the
fields
we’re interested in exporting -
Find students created last year
-
Convert student json response into csv with
json2csv
by passingfields
as options -
Define
dateTime
that includes date and time from year to seconds -
Define file path of export
-
Write the csv file and respond the public link to it (The directory should be declared static in express server settings to be publicly available). The link will look like “/exports/csv-20180526052911.csv”, which the client (mobile/web app) can access and download by appending it to the base url of the server
-
Remove the file after a few seconds, as we’re not interested to keep the file in our directory indefinitely
Also check
See also
- Preventing Privilege Escalation in NoSQL & SQL: Secure Node.js Practices
- Node JS Mongo Client for Atlas Data API
- SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method.
- Exactly Same Query Behaving Differently in Mongo Client and Mongoose
- MongoDB Single Update Query to Change the Field Name in All Matching Documents of the Collection
- AWS Layer: Generate nodejs Zip Layer File Based on the Lambda's Dependencies
- In Node JS HTML to PDF conversion, Populate Images From URLs