【问题标题】:MongoDB how to $project aggregate with multiple $sum?MongoDB如何用多个$sum进行$project聚合?
【发布时间】:2021-03-20 23:54:18
【问题描述】:

对于 MongoDB,需要对事件进行分组并提供多个属性字段。

我的目的是为一组显示相关的字段属性以及数字字段的总和列表。

对于 MongoDB,聚合有 $group 和 $project。 $project 可以显示 $group 中列出的字段。

我的 $group 本身运行良好,例如,没有 $project。当我在 $group 之前或之后提供 $project 时,我收到以下错误:

query failed: (Location40323) A pipeline stage specification object must contain exactly one field.

我的代码如下:

db.collection.aggregate([
    {
        $project: {
            eventName: "$EVENT_TYPE",
            registeredDate: "$BEGIN_DATE_TIME",
            stateName: "$STATE",
            damageCosts: "$DAMAGE_PROPERTY",
            peopleCosts: "$DEATHS_DIRECT",
            injuriyCosts: "$INJURIES_DIRECT",
            cropCosts: "$DAMAGE_CROPS"
        },
        $group: {
            _id: "$EVENT_TYPE",     
            totalPropCost: {
                $sum: "$DAMAGE_PROPERTY"
            },
            totalDeaths: {
                $sum: "$DEATHS_DIRECTY"
            },
            totalInjury: {
                $sum: "$INJURIES_DIRECT"
            },
            totalCropCost: {
                $sum: "$DAMAGE_CROPS"
            }
        }
     }
])

交替:尝试使用 $push 命令,它看起来像使用 $push 的有效运行:

db.collection.aggregate([
    {
        $group: {
            _id: "$EVENT_TYPE",     
            totalPropCost: {
                $sum: "$DAMAGE_PROPERTY"
            },
            totalDeaths: {
                $sum: "$DEATHS_DIRECTY"
            },
            totalInjury: {
                $sum: "$INJURIES_DIRECT"
            },
            totalCropCost: {
                $sum: "$DAMAGE_CROPS"
            },
            events: {
              $push: {
                  name: "$EVENT_TYPE",
                  date: "$BEGIN_DATE_TIME",
                  state: "$STATE"
              }
            }
        }
     }
])

我对这个 mongoDb 查询使用以下数据示例,如果没有 $project,它在 $sum 上可以正常工作。

[
  {
    "BEGIN_YEARMONTH": 201007,
    "BEGIN_DAY": 7,
    "END_YEARMONTH": 201007,
    "END_DAY": 7,
    "END_TIME": 1630,
    "STATE": "NEW HAMPSHIRE",
    "YEAR": 2010,
    "EVENT_TYPE": "Heat",
    "BEGIN_DATE_TIME": "07-JUL-10 12:51:00",
    "END_DATE_TIME": "07-JUL-10 16:30:00",
    "INJURIES_DIRECT": 0,
    "DEATHS_DIRECT": 0,
    "DAMAGE_PROPERTY": "0.00K",
    "DAMAGE_CROPS": "0.00K"
  },
  {
    "BEGIN_YEARMONTH": 201001,
    "BEGIN_DAY": 17,
    "END_YEARMONTH": 201001,
    "END_DAY": 18,
    "END_TIME": 1500,
    "STATE": "NEW HAMPSHIRE",
    "YEAR": 2010,
    "MONTH_NAME": "January",
    "EVENT_TYPE": "Heavy Snow",
    "BEGIN_DATE_TIME": "17-JAN-10 23:00:00",
    "END_DATE_TIME": "18-JAN-10 15:00:00",
    "INJURIES_DIRECT": 0,
    "DEATHS_DIRECT": 0,
    "DAMAGE_PROPERTY": "0.00K",
    "DAMAGE_CROPS": "0.00K"  
  }
]

【问题讨论】:

  • 期望的输出是什么?按 EVENT_TYPE 还是按 STATE 对事件进行分组?
  • 两者:EVENT_TYPE 和按状态,哦来源,单独的查询...

标签: mongodb mongodb-query aggregate


【解决方案1】:

对于这项调查,经过多次尝试,其他想法很受欢迎,尤其是使用 $project 的替代解决方案。渐渐地,这给了我足够的结果。 $push 命令似乎效果最好。如果有人知道如何让 $project 工作,请提供建议并提供解释。目前,$push 致力于为组和属性字段列表提供一种解决方案。

db.collection.aggregate([
    {
        $group: {
            _id: "$STATE",     
            totalPropCost: {
                $sum: "$DAMAGE_PROPERTY"
            },
            totalDeaths: {
                $sum: "$DEATHS_DIRECTY"
            },
            totalInjury: {
                $sum: "$INJURIES_DIRECT"
            },
            totalCropCost: {
                $sum: "$DAMAGE_CROPS"
            },
            events: {
              $push: {
                  eventName: "$EVENT_TYPE",
                  CzName: "$CZ_NAME",
                  cZTimeZone: "$CZ_TIMEZONE",
                  eventDate: "$BEGIN_DATE_TIME",
                  eventMonth: "$MONTH_NAME",
                  state: "$STATE",
                  observer: "$SOURCE"
              }
            }
        }
     }
])

【讨论】:

    猜你喜欢
    • 2018-03-27
    • 1970-01-01
    • 2023-02-19
    • 2012-10-24
    • 1970-01-01
    • 2019-09-29
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多