如何仅将CSV文件数据(JSON格式)存入MongoDB?
解决CSV上传后仅存二进制数据到MongoDB的问题
嘿,我看你现在的问题是上传CSV后MongoDB里只显示ObjectId和二进制数据对吧?这是因为你直接把上传的文件二进制内容存进数据库了,没有先把CSV解析成结构化的JSON格式。结合你已经引入的formidable、csvtojson和mongodb库,我给你调整一下代码逻辑,确保CSV数据能以JSON格式存入数据库:
核心修改思路
- 用
formidable处理文件上传,拿到临时文件路径 - 用
csvtojson把CSV文件解析成JSON数组 - 将解析后的JSON数组批量插入MongoDB
修改后的完整代码片段
var http = require('http'); var fs = require('fs'); var formidable = require('formidable'); var Converter = require("csvtojson").Converter; var mongodb = require('mongodb'); var MongoClient = mongodb.MongoClient; var url = 'mongodb://localhost:27017/CSVDATA'; http.createServer(function(req, res) { // 处理上传请求 if (req.url == '/upload' && req.method.toLowerCase() == 'post') { const form = new formidable.IncomingForm(); form.parse(req, function(err, fields, files) { if (err) { res.writeHead(500, {'Content-Type': 'text/plain'}); return res.end('上传出错: ' + err.message); } // 替换成你表单中文件输入框的name属性值 const csvFile = files.yourFileInputName; if (!csvFile) { res.writeHead(400, {'Content-Type': 'text/plain'}); return res.end('请选择要上传的CSV文件'); } // 初始化CSV转JSON转换器 const converter = new Converter({ // 可以根据你的CSV格式配置,比如分隔符、是否忽略空行等 // delimiter: ';', // 如果是分号分隔的CSV就打开这个注释 // ignoreEmpty: true }); // 监听解析完成事件 converter.on("end_parsed", function(jsonDataArray) { // 连接MongoDB MongoClient.connect(url, function(err, db) { if (err) { res.writeHead(500, {'Content-Type': 'text/plain'}); return res.end('数据库连接失败: ' + err.message); } // 替换成你要存储的集合名称 const collection = db.collection('csv_records'); // 批量插入JSON数据 collection.insertMany(jsonDataArray, function(err, result) { if (err) { res.writeHead(500, {'Content-Type': 'text/plain'}); res.end('插入数据失败: ' + err.message); } else { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end(`成功插入 ${result.insertedCount} 条CSV数据到MongoDB`); } // 关闭数据库连接 db.close(); // 可选:删除formidable生成的临时文件,释放磁盘空间 fs.unlink(csvFile.path, (unlinkErr) => { if (unlinkErr) console.log('删除临时文件失败:', unlinkErr); }); }); }); }); // 读取临时CSV文件并开始解析 fs.createReadStream(csvFile.path).pipe(converter); }); return; } // 显示上传表单(方便测试用) res.writeHead(200, {'Content-Type': 'text/html'}); res.end(` <form action="/upload" method="post" enctype="multipart/form-data"> <h3>上传CSV文件</h3> <input type="file" name="yourFileInputName" accept=".csv" required /> <br><br> <button type="submit">上传并导入到MongoDB</button> </form> `); }).listen(8080); console.log('服务器运行在 http://localhost:8080');
关键注意事项
- 记得把代码中的
yourFileInputName替换成你HTML表单里文件输入框的name属性值 csv_records是MongoDB的集合名,你可以改成自己需要的名称- 如果你的CSV不是用逗号分隔的(比如分号、制表符),可以在创建
Converter时配置delimiter参数 - 解析后的JSON会自动把CSV的第一行作为每个文档的键名,所以确保你的CSV表头是正确的
- 上传完成后可以删除formidable生成的临时文件,避免磁盘空间浪费
内容的提问来源于stack exchange,提问作者Dinesh Chebolu
相关产品推荐
相关产品推荐

