我需要将数组中对象的值导出为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”,但是我的数组的长度未知。有什么想法吗?
答案 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/