如何在MongoDB中按字段查询并仅导出指定字段到CSV
解决MongoDB查询指定字段并导出CSV的问题
问题描述
需要按companyurl字段查询所有MongoDB文档,并仅将companyurl字段的值导出到CSV文件,但当前代码会导出文档的所有字段,想了解如何在find操作中选择性查询指定字段。
文档结构
_id: ObjectId('63462fd9e52e05829198d5a2') company:"google" companyurl:"facebook.com" __v:0 _id: ObjectId('63462fd9e52e05829198d5a2') company:"google" companyurl:"amazon.com" __v:0 _id: ObjectId('63462fd9e52e05829198d5a2') company:"google" companyurl:"stackoverflow.com" __v:0 _id: ObjectId('63462fd9e52e05829198d5a2') company:"google" companyurl:"instagram.com" __v:0
当前代码
mongodb.connect( url, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => { if (err) throw err; client .db("mernapp") .collection("scrapeds") .find({}) .toArray((err, data) => { if (err) throw err; console.log(data); const json2csvParser = new Json2csvParser({ header: true }); const csvData = json2csvParser.parse(data); fs.writeFile("bezkoder_mongodb_fs.csv", csvData, function(error) { if (error) throw error; console.log("Write to bezkoder_mongodb_fs.csv successfully!"); }); client.close(); }); } );
解决方案
MongoDB的find()方法支持**投影(Projection)**参数,用来指定只返回需要的字段,同时结合json2csv的配置可以精准导出目标字段,以下是两种常用实现方式:
方式一:通过MongoDB投影只返回指定字段
在find()的第二个参数中设置投影规则,指定要保留的字段(值设为1),_id字段默认会被返回,需要显式设为0去除:
mongodb.connect( url, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => { if (err) throw err; client .db("mernapp") .collection("scrapeds") // 投影配置:仅返回companyurl,排除_id .find({}, { companyurl: 1, _id: 0 }) .toArray((err, data) => { if (err) throw err; console.log(data); const json2csvParser = new Json2csvParser({ header: true }); const csvData = json2csvParser.parse(data); fs.writeFile("bezkoder_mongodb_fs.csv", csvData, function(error) { if (error) throw error; console.log("Write to bezkoder_mongodb_fs.csv successfully!"); }); client.close(); }); } );
方式二:通过json2csv指定导出字段
如果不想修改MongoDB的查询结果,也可以直接在json2csv的配置中指定要导出的字段,过滤掉多余内容:
mongodb.connect( url, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => { if (err) throw err; client .db("mernapp") .collection("scrapeds") .find({}) .toArray((err, data) => { if (err) throw err; console.log(data); // 配置仅导出companyurl字段 const json2csvParser = new Json2csvParser({ fields: ['companyurl'], header: true }); const csvData = json2csvParser.parse(data); fs.writeFile("bezkoder_mongodb_fs.csv", csvData, function(error) { if (error) throw error; console.log("Write to bezkoder_mongodb_fs.csv successfully!"); }); client.close(); }); } );
推荐方案
优先选择方式一,因为MongoDB只返回需要的字段,减少了数据传输量,提升查询效率,后续数据处理也更简洁。
内容的提问来源于stack exchange,提问作者queshy
相关产品推荐
相关产品推荐

