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