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

fin*_*ook 5 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")

}
Run Code Online (Sandbox Code Playgroud)

为此,我使用以下命令:

mongoexport -f _id,page_id,last_updated_utc --query {page_id:1122334455} -d mydatabase -c mycollection --csv
Run Code Online (Sandbox Code Playgroud)

这给出了输出:

"99",1122334455,2013-12-19T13:17:43.994Z
exported 1 record
Run Code Online (Sandbox Code Playgroud)

问题是我需要输出中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
Run Code Online (Sandbox Code Playgroud)

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

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

pra*_*wda 6

蒙古出口

获取嵌套对象的属性

样本文件

{
"_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")
Run Code Online (Sandbox Code Playgroud)

} MongoExport语法

mongoexport --host <hostname> --db <Database Name> --collection <collection Name> --csv --fields fieldname1,fieldname2 --out fileName.csv
Run Code Online (Sandbox Code Playgroud)

示例:以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
Run Code Online (Sandbox Code Playgroud)

示例:以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
Run Code Online (Sandbox Code Playgroud)

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

$ unwind:从输入文档中解构一个数组字段,以输出每个元素的文档。每个输出文档都是输入文档,其中array字段的值被元素替换。

有关更多详细信息,请参考此链接

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


Nei*_*unn 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")

}
Run Code Online (Sandbox Code Playgroud)

这可以通过聚合转换为:

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

产量

[
     {
         "_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"
     }
 ],
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 这个答案是不正确的:1.结构化字段(例如数组)实际上被忽略,并且不会出现在输出中。2.您可以简单地通过使用mongoDb的字段定义“ field1.field2”来指定子字段,必须为数组添加索引,例如“ field1.0”等。有关版本,请参见mongoDb规范。 (2认同)