如何将mongoexport属性从一个对象数组转换为CSV?

时间:2012-05-05 21:39:54

标签: arrays mongodb 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”,但是我的数组的长度未知。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您必须编写一个自定义脚本,该脚本遍历集合并以所需格式导出文档。内置的mongoexport不适合像你这样的用例。

答案 1 :(得分:1)

如果您对 Perl 感到满意,那么以下article中的ARJsonLib.pm库将提供您需要的大部分功能,以创建您自己的小玩具。请注意,文章中的版本是来自我一起攻击的玩具的存根,它完全符合您的要求以及其他一些内容,但由于不是mongoDB文章,它缺少您需要的一个功能,它会找到一个字段/键。 mongoDB集合,并将它们存储在一个数组中,但是很容易重构,只需要写一些从你的集合中拉出 n 文件的东西,将它们推入一个数组并调用findKeysInJsonColl()。无论如何,有几个函数会将MongoDB游标作为参数,并且:

convertToDojoGrid()
convertToExcel()

再次 CSV 输出丢失了,但很容易添加回convertToExcel()。

e.g。

...
my $iRows  = convertToExcel("/tmp/test.xlsx", $oMongoData, "", \@aOutFields, "xlsx");
...

其中:$ oMongoData是MongoDB Cursor引用,@ aOutFields是一个数组,包含您希望在工作表中显示的字段/键,

答案 2 :(得分:1)

您可以使用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运算符用于稍微改造数据 - 将types.type解包为type并为每个文档提供新的唯一_id值。

最后,聚合管道生成的文档将输出到" tmp4csv"使用$ out运算符的集合。如果在上一步中没有创建唯一的_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/