8

我需要将数组中对象的值导出到 CSV。假设我的文件是:

{
    名称:“测试”,
    类型:[
        {类型:“A”},
        {类型:“B”},
                {类型:“C”}
    ]
}

我的目标是产生如下输出:

“测试”,“A”
“测试”,“B”
“测试”、“C”

以下也是可以接受的:

“测试”、“A、B、C”

我正在尝试通过 mongoexport 使用:

mongoexport -h localhost -d mydb -c mycollection -f name,types.type --csv

不幸的是,我得到:

“测试”,

我找到了有关引用特定数组元素的文档,例如“types.0.type”,但我的数组的长度是未知的。有任何想法吗?

4

3 回答 3

1

您必须编写一个自定义脚本,以迭代集合并以所需格式导出文档。内置的 mongoexport 不是为像你这样的用例而设计的。

于 2012-05-06T03:39:04.297 回答
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 值。

最后,聚合管道生成的文档使用 $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/

于 2015-02-18T00:18:32.340 回答
1

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

convertToDojoGrid()
convertToExcel()

CSV输出再次丢失,但添加回 convertToExcel() 很简单。

例如

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

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

于 2012-11-15T12:58:18.777 回答