Mongodb:根据另一个元素重命名数组中的json元素

时间:2018-01-26 10:40:59

标签: json mongodb aggregation-framework

我需要压缩一些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经验,所以任何指针(教程/建议的提示/链接)都会非常有用。 非常感谢。

1 个答案:

答案 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
}
>