Mongoexport在CSV输出中获取嵌套对象的属性

时间:2014-01-31 16:19:24

标签: mongodb mongoexport

我正在尝试使用mongoexport从mongo-db获取CSV。

我的数据采用以下格式:

{
    "_id": "99",
    "page_id": NumberLong(1122334455),
    "data": {
        "0": {
            "item_id": NumberLong(123456789),
            "item_name": "item1"

        },
        "1": {
            "item_id": NumberLong(987654321),
            "item_name": "item2"
        },
     },
    "last_updated_utc": ISODate("2013-12-19T13:17:43.994Z")

}

为此,我使用以下命令:

mongoexport -f _id,page_id,last_updated_utc --query {page_id:1122334455} -d mydatabase -c mycollection --csv

这给出了输出:

"99",1122334455,2013-12-19T13:17:43.994Z
exported 1 record

问题是我需要输出中item_name个元素的data。这些是一个动态数组,可能不包含任何项目或许多项目。

如果我将data添加到字段(-f)参数中,那么它会将此作为JSON字符串输出到CSV中,用于每个对象,这对将来使用数据没有帮助。

我的目标是:

"99",1122334455,2013-12-19T13:17:43.994Z,item1
"99",1122334455,2013-12-19T13:17:43.994Z,item2

几乎非规范化,或者像SQL中的外连接一样。所以它只是data项目ID。

这可能吗?如何将item_id放入CSV输出?

2 个答案:

答案 0 :(得分:5)

Mongoexport是一个实用程序,允许默认情况下将数据导出为JSON,也可以选择CSV。任何子文档信息都将是,因为您注意到输出为JSON,因为它是任何不是顶级字段的数据的唯一有效表示。因此它是为基本用例而设计的。

对于其他任何事情,您需要编写自己的解决方案,读取数据并转换为CSV输出。

如果可能的话,您是否可以首先重新考虑数据的结构。data下的结构作为键控子文档没有任何意义。如果它是一个数组,你至少可以使用聚合框架完成一半的工作。

{
    "_id": "99",
    "page_id": NumberLong(1122334455),
    "data": [
    {
            "item_id": NumberLong(123456789),
            "item_name": "item1"

        },
        {
            "item_id": NumberLong(987654321),
            "item_name": "item2"
        },
     ],
    "last_updated_utc": ISODate("2013-12-19T13:17:43.994Z")

}

这可以通过聚合转换为:

db.sample.aggregate([
    {$unwind: "$data"},
    {$project: { 
       page_id: 1,
       item_name: "$data.item_name",
       last_updated_utc: 1
     }}
])

产生

[
     {
         "_id" : "99",
         "page_id" : NumberLong(1122334455),
         "last_updated_utc" : ISODate("2013-12-19T13:17:43.994Z"),
         "item_name" : "item1"
     },
     {
         "_id" : "99",
         "page_id" : NumberLong(1122334455),
         "last_updated_utc" : ISODate("2013-12-19T13:17:43.994Z"),
         "item_name" : "item2"
     }
 ],

这是非规范化形式,为我们提供了转换为CSV的更多希望。

这里结构的问题是因为data中的每个子文档都是键控的,而data本身不是数组,所以你不得不以编程方式遍历每个元素。这也限制了可以执行的查询函数的实用性,因为每个子文档都需要显式命名。

所以没有工具,你的数据不会让事情变得更容易。如果可以,请更改它。

答案 1 :(得分:4)

MongoExport

获取嵌套对象的属性

示例文档

{
"_id": "99",
"page_id": NumberLong(1122334455),
"data": {
    "0": {
        "item_id": NumberLong(123456789),
        "item_name": "item1"

    },
    "1": {
        "item_id": NumberLong(987654321),
        "item_name": "item2"
    },
 },
"last_updated_utc": ISODate("2013-12-19T13:17:43.994Z")

} MongoExport语法

mongoexport --host <hostname> --db <Database Name> --collection <collection Name> --csv --fields fieldname1,fieldname2 --out fileName.csv

示例:以CSV格式导出

mongoexport --host localhost --db xyz --collection abc --csv --fields data.0.item_id,data.0.item_name,data.1.item_id,data.1.item_name --out important.csv

示例:以JSON格式导出

mongoexport --host localhost --db xyz --collection abc --fields data.0.item_id,data.0.item_name,data.1.item_id,data.1.item_name --out important.csv

如果要获取数组的值,则需要展开数组。

<强> $退绕: 从输入文档解构数组字段以输出每个元素的文档。每个输出文档都是输入文档,数组字段的值由元素替换。

更多详情请参阅此链接

https://docs.mongodb.org/v3.0/reference/operator/aggregation/unwind/