2017-03-09 142 views
0

我在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的

回答

0

问题你可以通过改变你的代码来解决空的子文档:

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