繁体   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