【发布时间】: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