[英]How do I mongoexport attributes from an array of objects to CSV?
我需要將數組中的對象的值導出為CSV。 假設我的文件是:
{ name:"test", types:[ {type:"A"}, {type:"B"}, {type:"C"} ] }
我的目標是產生如下輸出:
"test", "A" "test", "B" "test", "C"
以下內容也是可以接受的:
"test", "A,B,C"
我正在嘗試使用以下方法通過mongoexport實現此目的:
mongoexport -h localhost -d mydb -c mycollection -f name,types.type --csv
不幸的是,我得到:
"test",
我找到了有關引用特定數組元素(例如“ types.0.type”)的文檔,但是數組的長度未知。 有任何想法嗎?
您必須編寫一個自定義腳本,以遍歷集合並以所需格式導出文檔。 內置mongoexport並非為像您這樣的用例設計。
如果您對Perl感到滿意,那么下面的文章中的ARJsonLib.pm庫提供了創建您自己的小玩具所需的大多數功能。 請注意,本文中的版本是我砍在一起的玩具的存根,它確實可以完成您想要的東西以及其他一些東西,但由於不是mongoDB文章,它缺少您需要的一個功能,即可以在其中找到字段/鍵。 mongoDB集合,並將它們存儲在數組中,但是要進行重構很簡單,只需編寫一些東西,即可從集合中提取n個文檔,將它們推入數組並調用findKeysInJsonColl()。 無論如何,有兩個函數將MongoDB游標作為參數,並且:
convertToDojoGrid()
convertToExcel()
再次缺少CSV輸出,但是將其添加回convertToExcel()很簡單。
例如
...
my $iRows = convertToExcel("/tmp/test.xlsx", $oMongoData, "", \@aOutFields, "xlsx");
...
其中:$ oMongoData是MongoDB游標引用,而@aOutFields是包含希望在工作表中顯示的字段/鍵的數組,
您可以通過使用MongoDb的聚合管道操作來構建臨時集合,並使用要導出的形狀的數據來完成您要嘗試的操作:
use mydb
db.mycollection.aggregate([
{$unwind: "$types"},
{$project: { _id: 0, name: 1, type: "$types.type" } },
{$out: "tmp4csv"}
]);
這將創建一個tmp4csv集合,其中包含該數組每個元素的文檔
即在您的示例中(並添加_id值,因為在我建議的解決方案中必須考慮該值)
{
_id: ObjectId("54e3ce75cb87e6d036287cc6"),
name:"test",
types:[
{type:"A"},
{type:"B"},
{type:"C"}
]
}
通過使用$ unwind運算符成為
{ _id: ObjectId("54e3ce75cb87e6d036287cc6"), name:"test", types:[ {type:"A"} ] },
{ _id: ObjectId("54e3ce75cb87e6d036287cc6"), name:"test", types:[ {type:"B"} ] },
{ _id: ObjectId("54e3ce75cb87e6d036287cc6"), name:"test", types:[ {type:"C"} ] }
接下來,$ project運算符用於稍微修改數據-將type.type解壓縮為type,並為每個文檔提供一個新的唯一_id值。
最終,使用$ out運算符將由聚合管道生成的文檔輸出到“ tmp4csv”集合中。 如果沒有在上一步中創建唯一的_id值,則此步驟將由於鍵重復而失敗。
然后可以將數據導出到輸出文件:
mongoexport -h localhost -d mydb -c tmp4csv -f name,type --csv --out output.csv
為了使所有內容保持干凈,我將刪除在其中創建的tmp4csv集合:
use mydb
db.tmp4csv.drop()
這應該會為您提供帶有首選輸出格式的csv文件。
參考:聚合管道文檔: http ://docs.mongodb.org/manual/aggregation/展開運算符,因為這很關鍵: http : //docs.mongodb.org/manual/reference/operator/aggregation/unwind/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.