从MongoDB导出嵌套数据

时间:2017-06-27 15:15:04

标签: mongodb csv mongodb-query aggregation-framework

我正在尝试将MongoDB中的嵌套字段导出为CSV。

从下面的代码中,我想提取比例名称(例如“安全”和“电源”)和 raw_score (例如2& 3)分别)字段。这四个字段将存储在CSV中的四列中,其中每列都是一个提取字段。

"results" : {
        "scales" : [
            {
                "scale" : {
                    "name" : "Security",
                    "code" : "SEC",
                    "multiplier" : 1
                },
                "raw_score" : 2
            },
            {
                "scale" : {
                    "name" : "Power",
                    "code" : "POW",
                    "multiplier" : -1
                },
                "raw_score" : 3
            }
        ],

在过去,我成功地使用点符号来提取嵌套字段(以下提取的下面的工作示例),但我不确定如何提取共享相同名称的字段。

mongoexport -d production_hoganx_collector_061817 -c records --type=csv -o col_liwc_summary_061817.csv -f user_id,post_analysis.liwc_scores.tone

如何使用mongoexport命令提取名称 raw_score 字段?我试图将数据库导出到JSON文件,然后通过R提取数据,但是这个方法需要很长时间才能完成。

如果mongoexport不适合,我愿意听取替代方案!

非常感谢,

1 个答案:

答案 0 :(得分:1)

我假设这是一次性的事情,所以我建议使用聚合来构建一个新的集合,其中scales数组是unwinded。

展开扇出n个文档中的文档,其中n是展开指定的数组类型字段中的元素数量。例如,如果您有这样的文档:

{
    name: "Some name",
    email: ["somename@somedomain.com", "name@someotherdomain.com"]
}

email字段上展开会产生两个文档:

{
    name: "Some name",
    email: "somename@somedomain.com"
},
{
    name: "Some name",
    email: "name@someotherdomain.com"
}

因此,在您的情况下,我认为您应该使用它来解开您的比例字段,如下所示:

db.collection.aggregate([
    {$match: yourCondition},
    {$unwind: "$scales"},
    {$project: {
        _id: false,
        scales: true,
        ... other fields ...
    }},
    {$out: "unwindedcollection"}
]);

此时,您应该能够使用之前使用的点符号从生成的新集合(unwindedcollection)中使用mongoexport。

请务必在_id上设置为false,否则您最终会出现重复的_id错误。您不想投影该字段,因此在插入新集合时会创建新的ID,并且会转储您的汇总结果。

我将链接留给我用于此的概念的文档:

汇总:https://docs.mongodb.com/manual/reference/method/db.collection.aggregate/

$ project:https://docs.mongodb.com/manual/reference/operator/aggregation/project/

$ unwind:https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/

$ out:https://docs.mongodb.com/manual/reference/operator/aggregation/out/