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

Mongodb Mongoexport获取CSV输出中嵌套对象的属性,mongodb,mongoexport,Mongodb,Mongoexport,我正在尝试使用mongoexport从MongoDB获取CSV 我的数据采用以下格式: { "_id": "99", "page_id": NumberLong(1122334455), "data": { "0": { "item_id": NumberLong(123456789), "item_name": "item1" }, "1": { "

我正在尝试使用mongoexport从MongoDB获取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
问题是我需要输出中的
数据
元素中的
项名称
。这是一个动态数组,可以不包含任何项,也可以包含许多项

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

我的目标是:

"99",1122334455,2013-12-19T13:17:43.994Z,item1
"99",1122334455,2013-12-19T13:17:43.994Z,item2
几乎是非规范化的,或者类似于SQL中的外部联接。因此它只是
数据
项目ID


这可能吗?如何将
项目\u id
导入CSV输出?

Mongoexport是一个实用工具,允许在默认情况下或可选CSV下将数据导出到JSON。正如您所注意到的,任何子文档信息都将作为JSON输出,因为它是任何非顶级字段的数据的唯一有效表示形式。因此,它是为基本用例设计的

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

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

{
“_id”:“99”,
“页码id”:长编号(1122334455),
“数据”:[
{
“项目id”:编号长(123456789),
“项目名称”:“项目1”
},
{
“项目id”:编号长(987654321),
“项目名称”:“项目2”
},
],
“上次更新utc”:ISODate(“2013-12-19T13:17:43.994Z”)
}
这可以通过聚合转换为:

db.sample.aggregate([
{$unwind:“$data”},
{$project:{
页码:1,
项目名称:“$data.item\u name”,
上次更新协调世界时:1
}}
])
产生

[
{
“_id”:“99”,
“页码id”:长编号(1122334455),
“上次更新utc”:ISODate(“2013-12-19T13:17:43.994Z”),
“项目名称”:“项目1”
},
{
“_id”:“99”,
“页码id”:长编号(1122334455),
“上次更新utc”:ISODate(“2013-12-19T13:17:43.994Z”),
“项目名称”:“项目2”
}
],
这是非常非规范化的形式,给了我们更多转换为CSV的希望

这里结构的问题是,由于
数据
中的每个子文档都是键控的,并且
数据
本身不是数组,因此必须通过编程遍历每个元素。这还限制了查询函数的实用性,因为每个子文档都需要显式命名


因此,没有工具,您的数据也无法让事情变得更简单。如果可以,请更改它。

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
示例:以JSON格式导出

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
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
如果要获取数组的值,则必须展开数组

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

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


不幸的是,我无法控制对象结构。谢谢你提供的信息。这个答案不正确:1。结构化字段(如数组)实际上会被忽略,不会出现在输出中。2.您只需使用mongoDb的字段定义
field1即可指定子字段。对于数组,field2
必须包含一个索引,如
field1.0
等。有关您的版本,请参阅mongoDb规范。您好,尼尔,您的聚合示例非常有用。您将如何获取非规范化数据并从中生成CSV输出?这应该是公认的答案。它能满足询问者的需求,对我来说就像一个符咒。