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输出?
蒙古出口
获取嵌套对象的属性
样本文件
{
"_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/
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它本身不是数组,所以你不得不以编程方式遍历每个元素.这也限制了可以执行的查询函数的实用性,因为每个子文档都需要显式命名.
所以没有工具,你的数据不会让事情变得更容易.如果可以的话,改变它.
| 归档时间: |
|
| 查看次数: |
6541 次 |
| 最近记录: |