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

标签 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 多个统计数据。

到目前为止,我所做的工作很有帮助,我想我可以在 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/

相关文章:

c# - Entity Framework 数据库首先出现加载相关实体的问题(ASP.NET Web api)

node.js - 如何将 'resolve' MongoDB 对象转换为 Nodejs 中的特定 JSON 结构?

mongodb - Meteor.js 一直在运行 SIGKILL?

arrays - MongoDB聚合,如何addToSet组管道中数组的每个元素

Mongodb 更新管道更新嵌套数组中元素的字段

python - Django 中的 JSON 对象数组解析

java.lang.String 类型的 Android Value ... 无法转换为 JSONArray

java - Gson 调用在多个类上返回空对象

MongoDB 索引多输入搜索

node.js - 在嵌套数组中搜索多个值