在 MongoDB 中组合组 - 聚合
Combining groups in MongoDB - Aggregation
我在MySQL
中有这段代码对应一个简单的汽车数据库
SELECT
"Cost" AS "Metric",
AVG(car_cost) As "Avg",
MIN(car_cost) As "Min",
MAX(car_cost) As "Max",
"Dollars" As "Unit"
from db.car_data
union SELECT
'Mileage',
AVG(car_mileage),
MIN(car_mileage),
MAX(car_mileage),
'Miles'
from db.car_data
那个returns这个table
Metric
Avg
Min
Max
Cost
2345
5674
53456
Mileage
49023
53
178003
但是,当在 MongoDB
中重新创建它时,我 运行 变成了一个问题
db.car_data.aggregate([
{"$group":
{
_id: null,
Avg: {
$avg: { "$car_cost" }
},
Min: {
$min: { "$car_cost" }
},
Max: {
$max: { "$car_cost" }
}
}
},
{"$group":
{
_id: null,
Avg: {
$avg: { car_mileage }
},
Min: {
$min: { car_mileage }
},
Max: {
$max: { car_mileage }
}
}
}
]);
实际输出
[
{
"_id": null,
"Avg": null,
"Min": null,
"Max": null
}
]
预期输出
[
{
"_id": null,
"Avg": 2345,
"Min": 5674,
"Max": 53456
},
{
"_id": null,
"Avg": 49023,
"Min": 53,
"Max": 178003
}
]
我是在做错什么,还是有更好的方法通过 Mongo 中的聚合来做到这一点?他们每个人都在 Mongo 独自工作...
查询
- 你在 1 个数据库中有 1 个集合,你想要 6 个累加器
- 您可以将它们分成 3 个一组,甚至分成 2 个文档,以获得与结果
完全相同的 SQL
*我们有 $facet
$unionWith
等,但您不需要这些,无需进行多次聚合,只需 1 个即可获得所需的一切。
aggregate(
[ {
"$group" : {
"_id" : null,
"avg_cost" : {
"$avg" : "$car_cost"
},
"min_cost" : {
"$min" : "$car_cost"
},
"max_cost" : {
"$max" : "$car_cost"
},
"avg_mileage" : {
"$avg" : "$car_mileage"
},
"min_mileage" : {
"$min" : "$car_mileage"
},
"max_mileage" : {
"$max" : "$car_mileage"
}
}
}, {
"$set" : {
"array" : [ {
"metric" : "cost",
"avg" : "$avg_cost",
"min" : "$min_cost",
"max" : "$max_cost"
}, {
"metric" : "mileage",
"avg" : "$avg_mileage",
"min" : "$min_mileage",
"max" : "$max_mileage"
} ]
}
}, {
"$unwind" : {
"path" : "$array"
}
}, {
"$replaceRoot" : {
"newRoot" : "$array"
}
} ]
)
我在MySQL
中有这段代码对应一个简单的汽车数据库
SELECT
"Cost" AS "Metric",
AVG(car_cost) As "Avg",
MIN(car_cost) As "Min",
MAX(car_cost) As "Max",
"Dollars" As "Unit"
from db.car_data
union SELECT
'Mileage',
AVG(car_mileage),
MIN(car_mileage),
MAX(car_mileage),
'Miles'
from db.car_data
那个returns这个table
Metric | Avg | Min | Max |
---|---|---|---|
Cost | 2345 | 5674 | 53456 |
Mileage | 49023 | 53 | 178003 |
但是,当在 MongoDB
中重新创建它时,我 运行 变成了一个问题
db.car_data.aggregate([
{"$group":
{
_id: null,
Avg: {
$avg: { "$car_cost" }
},
Min: {
$min: { "$car_cost" }
},
Max: {
$max: { "$car_cost" }
}
}
},
{"$group":
{
_id: null,
Avg: {
$avg: { car_mileage }
},
Min: {
$min: { car_mileage }
},
Max: {
$max: { car_mileage }
}
}
}
]);
实际输出
[
{
"_id": null,
"Avg": null,
"Min": null,
"Max": null
}
]
预期输出
[
{
"_id": null,
"Avg": 2345,
"Min": 5674,
"Max": 53456
},
{
"_id": null,
"Avg": 49023,
"Min": 53,
"Max": 178003
}
]
我是在做错什么,还是有更好的方法通过 Mongo 中的聚合来做到这一点?他们每个人都在 Mongo 独自工作...
查询
- 你在 1 个数据库中有 1 个集合,你想要 6 个累加器
- 您可以将它们分成 3 个一组,甚至分成 2 个文档,以获得与结果 完全相同的 SQL
*我们有 $facet
$unionWith
等,但您不需要这些,无需进行多次聚合,只需 1 个即可获得所需的一切。
aggregate(
[ {
"$group" : {
"_id" : null,
"avg_cost" : {
"$avg" : "$car_cost"
},
"min_cost" : {
"$min" : "$car_cost"
},
"max_cost" : {
"$max" : "$car_cost"
},
"avg_mileage" : {
"$avg" : "$car_mileage"
},
"min_mileage" : {
"$min" : "$car_mileage"
},
"max_mileage" : {
"$max" : "$car_mileage"
}
}
}, {
"$set" : {
"array" : [ {
"metric" : "cost",
"avg" : "$avg_cost",
"min" : "$min_cost",
"max" : "$max_cost"
}, {
"metric" : "mileage",
"avg" : "$avg_mileage",
"min" : "$min_mileage",
"max" : "$max_mileage"
} ]
}
}, {
"$unwind" : {
"path" : "$array"
}
}, {
"$replaceRoot" : {
"newRoot" : "$array"
}
} ]
)