我正在尝试使用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输出?
答案 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/