簡體   English   中英

如何將對象數組中的屬性從mongoexport導出為CSV?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM