7

我正在尝试使用 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_namedata元素。这些是一个动态数组,可以不包含任何项目或许多项目。

如果我添加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 输出?

4

2 回答 2

7

蒙古出口

获取嵌套对象的属性

样本文件

{
"_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

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

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

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

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

于 2016-01-12T12:50:42.837 回答
6

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本身不是数组,因此您被迫以编程方式遍历每个元素。这也限制了可以执行的查询功能的实用性,因为每个子文档都需要显式命名。

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

于 2014-02-01T00:30:52.123 回答