我需要展平一些 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 多个统计数据。
到目前为止,我所做的工作很有帮助,我想我可以在 Python 或 Excel 中的 vba 中完成其余部分,但我希望能够一步完成所有这些工作。我真的是 MongoDB 的新手,没有任何 javascript 经验,所以任何指针(提示/教程/建议的链接)都会非常有用。 非常感谢。
最佳答案
如果您使用的是 mongo 3.6.x,请尝试此聚合
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
}
>
示例文档
> db.col.findOne()
{
"_id" : ObjectId("5a69aafefe0428ada3c1cb9d"),
"company_id" : 8,
"year" : 2017,
"customer_id" : "1691",
"department_id" : "11",
"Stat" : [
{
"@value" : 7,
"@attributes" : {
"name" : "A"
}
},
{
"@value" : 3,
"@attributes" : {
"name" : "B"
}
},
{
"@value" : 14,
"@attributes" : {
"name" : "C"
}
}
]
}
>
关于json - Mongodb:根据另一个元素重命名数组中的json元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48459756/