将Mongoose文档写入csv文件
问题描述:
我在MongoDB数据库中有一些文档。将Mongoose文档写入csv文件
我想导出将这些文档打印为csv文件。
一些文件具有嵌套对象,所以我想我必须先操纵它们。
因此,一个文件可能是
{
name: {
english: "English Name",
spanish: "Spanish name"
},
subdocuments: [
{
quantity: 100,
price: 20
},
{
quantity: 200,
price: 30
},
]
}
我想最好的解决办法是把它打印出来对象作为两行:
所以English Name, Spanish Name, Quantity, Price
===========================================
English Name, Spanish Name, 100, 20
English Name, Spanish Name, 200, 30
我怎么能这样做呢?是否最好使用write-to-csv Node.js包?
我想我需要与
const rows = [];
Collection.find({}).then(docs => {
docs.forEach(doc => {
doc.subdocuments.forEach(subdocument => {
rows.push({ 'English Name': doc.name.english, 'Spanish Name': doc.name.spanish, quantity: subdocument.quantity, price: subdocument.price });
});
});
});
检索文件,但使用这种方法,如果文档包含子文档,我将只得到一排,所以我也有兴趣在单行如果subdocuments
阵列空 - 只有数量和价格列空。
当我有这个数组的对象,我想将其写入到一个csv文件,这可能是很简单的,所以我想这是最好的,只是像做
var csv = '';
// headers
csv += 'English Name, Spanish Name, Quantity, Price\n';
rows.forEach(row => {
csv += row['Spanish Name'] + ', ' + row['English Name'] + ', ' + row.quantity + ', ' + row.price + '\n';
});
但是,这是真的正确的做法?我怎样才能确保用户下载它作为一个CSV文件?文本还可以包含特殊字符(例如ö,ä等)。我使用Express在Node.js的
答
问题你可以通过改变你的代码来解决空的子文档:
const rows = [];
Collection.find({}).then(docs => {
docs.forEach(doc => {
if(doc.subdocuments.length === 0)
rows.push({ 'English Name': doc.name.english, 'Spanish Name': doc.name.spanish, quantity: 0, price: 0 });
doc.subdocuments.forEach(subdocument => {
rows.push({ 'English Name': doc.name.english, 'Spanish Name': doc.name.spanish, quantity: subdocument.quantity, price: subdocument.price });
});
});
});
稍后,您可以将其转换例如使用到csv json2csv