2017-03-09 96 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