我需要压缩一些JSON数据,以便我可以将CSV格式发送给某些客户端。我差不多......在MongoDB中使用聚合框架,到目前为止,我已经设法让它为每个客户输出:
{
"_id" : ObjectId("5a69aafefe0428ada3c1cb9d"),
"company_id" : NumberInt(8),
"year" : NumberInt(2017),
"customer_id" : "1691",
...
...
"department_id" : "11",
"Stat" : [
{
"@value" : NumberInt(7),
"@attributes" : {
"name" : "A"
}
},
{
"@value" : NumberInt(3),
"@attributes" : {
"name" : "B"
}
},
{
"@value" : NumberInt(14),
"@attributes" : {
"name" : "C"
}
}
]
}
然而,我理想的是为每个客户提供这个:
{
"_id" : ObjectId("5a69aafefe0428ada3c1cb9d"),
"company_id" : NumberInt(8),
"year" : NumberInt(2017),
"customer_id" : "1691",
...
...
"department_id" : "11",
"A" : NumberInt(7),
"B" : NumberInt(3),
"C" : NumberInt(14)
}
基本上,我需要将数组元素移动到根级别,并根据@ attributes.name字段重命名元素@value。 Stat数组也很大,其中有超过50个统计数据。
到目前为止我所做的一切都有所帮助,我想我可以在Excel中用python或vba完成剩下的工作,但我希望能够一步到位完成所有这些工作。我是MongoDB的新手,没有任何javascript经验,所以任何指针(教程/建议的提示/链接)都会非常有用。 非常感谢。
答案 0 :(得分:0)
如果您使用的是mongo 3.6.x
,请尝试此聚合yyyy-mm-dd hh:mm:ss[.f...]
结果
db.col.aggregate([
{ $addFields : {Stat : {$map : {input : "$Stat", as : "s", in : {$objectToArray : "$$s"}}}}},
{ $addFields : {Stat : {$map : {input : "$Stat", as : "s", in : [{$arrayElemAt : ["$$s.v.name",0]},{$arrayElemAt : ["$$s.v",0]}]}}}},
{ $addFields : {Stat : {$arrayToObject : "$Stat"}}},
{ $replaceRoot: { newRoot: { $mergeObjects: [ "$$ROOT", "$Stat" ] } }},
{ $project : {Stat : 0}}
])
示例文档
> db.col.aggregate([
... { $addFields : {Stat : {$map : {input : "$Stat", as : "s", in : {$objectToArray : "$$s"}}}}},
... { $addFields : {Stat : {$map : {input : "$Stat", as : "s", in : [{$arrayElemAt : ["$$s.v.name",0]},{$arrayElemAt : ["$$s.v",0]}]}}}},
... { $addFields : {Stat : {$arrayToObject : "$Stat"}}},
... { $replaceRoot: { newRoot: { $mergeObjects: [ "$$ROOT","$Stat" ] } }},
... { $project : {Stat : 0}}
... ]).pretty()
{
"_id" : ObjectId("5a69aafefe0428ada3c1cb9d"),
"company_id" : 8,
"year" : 2017,
"customer_id" : "1691",
"department_id" : "11",
"A" : 7,
"B" : 3,
"C" : 14
}
>