【问题标题】:How to get flatten JSON result with MongoDB aggregation?如何使用 MongoDB 聚合获得扁平化的 JSON 结果?
【发布时间】:2018-09-27 09:54:10
【问题描述】:

聚合后,我得到了一个非预期的输出。有什么我可以做的吗?

aggregate([ 
            { "$match": {
                "CREATE_DATE": {
                    "$lte": new Date(),
                    "$gte": new Date(new Date().setDate(new 
                       Date().getDate()-120))
                }
            } },
            { "$group": {
                "_id": { 
                    "month": { "$month": "$CREATE_DATE" },
                    "year": { "$year": "$CREATE_DATE" }
                },
                "avgofozone": { "$avg": "$OZONE" }
            } }

        ])

实际输出:

[
    { "avgofozone" : 21.07777777777778, "year" : 2018, "month" : 2 }
    { "avgofozone" : 17.8, "year" : 2018, "month" : 3 }
    { "avgofozone" : 17.8, "year" : 2018, "month" : 1 }
]

预期输出:

    [
        { 
            "zone_type": "avgofozone", 
            "year": 2018, 
            "February": 21.07777777777778, 
            "March": 17.8, 
            "January": 17.8 
        }
    ]

【问题讨论】:

  • 能否请您发布一个示例输入文档?
  • @Vega 我们可以显示月份名称整数 no prob { "_id" : ObjectId("5a65b71a3071ebb37576b3b56"), "ID" : "20180120210013631847000000", "DISTRICT" : "ntvp", "STATION" : “APPPCB”,“臭氧”:25.0,“FLAG1”:“NA”,“氨”:11.4,“苯”:6.7,“FLAG2”:“NA”,“FLAG3”:“NA”,“CREATE_DATE”: ISODate("2018-03-20T18:32:50.000Z"), "DATA_FROM" : "Gtuy" }
  • @Vega 我的预期输出是每个月的数字都替换为 avgofozone

标签: mongodb mongoose aggregation


【解决方案1】:

使用 MongoDB >= v3.4.4,您可以将以下阶段添加到现有管道的末尾,这将为您完成转换:

{
    $addFields: {
        result: {
            $let: {
                vars: { "months": [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], arr: { $objectToArray: "$$ROOT" } },
                in: {
                    "k" : { $arrayElemAt: [ "$$months" , { $subtract: [ { $arrayElemAt: [ "$$arr.v" , 2 ] }, 1 ] } ] },
                    "v" : { $arrayElemAt: [ "$$arr.v" , 0 ] }
                }
            }
        }
    }
}, {
    $group: {
        _id: "$year",
        result: { $push: "$result" },
    }
}, {
    $addFields: {
        "result": { $arrayToObject: "$result" },
    }
}, {
    $addFields: {
        "result.zonetype": "avgofozone",
        "result.year": "$_id"
    }
}, {
    $replaceRoot: {
        newRoot: "$result"
    }
}

【讨论】:

  • @dnickless iam 尝试使用此代码显示错误消息 .."errmsg" : "unknown group operator '$mergeObjects'",
  • @dnickless 我的 mongodb 3.4 版
  • 请查看我更新的答案,它应该从 3.4.4 开始工作
  • @ dnickless 我得到了输出 pettaran 但有些错误 avarageozone 被这样的年份取代 { "Jan" : 2018, "Mar" : 2018, "zonetype" : "avgofozone", "year" : 2018 }
  • 我猜你正在使用 Robo3T 来运行这个查询?似乎有一个时髦的错误 - 我有同样的行为。尝试使用 mongo.exe 运行查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 2021-11-19
  • 2011-11-15
  • 2014-05-17
  • 2021-07-01
  • 1970-01-01
相关资源
最近更新 更多