I have the following docs in my collection -
{
name: 'test1',
score: 80
},
{
name: 'test2',
score: 50
},
{
name: 'test3',
score: 100
},
{
name: 'test4',
score: 70
}
I would like to aggregate and group those docs, based on scores ranges - 0-60, 61-90, 91-100
so the results will look like -
{
score: '0-60',
tests: ['test2']
},
{
score: '61-90',
tests: ['test1', 'test4']
},
{
score: '91-100',
tests: ['test3']
}
Can I somehow group values by ranges in MongoDB?
CodePudding user response:
db.collection.aggregate([
{
$addFields: {
range: {//Create customised ranges
$switch: {
branches: [
{
case: {
$lte: [
"$score",
60
]
},
then: "0-60"
},
{
case: {
$lte: [
"$score",
90
]
},
then: "61-90"
},
{
case: {
$lte: [
"$score",
100
]
},
then: "91-100"
}
],
default: "invalid"
}
}
}
},
{
"$group": {//Group on the range
"_id": "$range",
"tests": {
"$push": "$name"
}
}
}
])
CodePudding user response:
You may check also the $bucketAuto aggregation operator which allow you to auto group by range based on number of ranges:
db.collection.aggregate([
{
$bucketAuto: {
groupBy: "$score",
buckets: 3
}
}
])
Explained: You provide the field in groupBy by which you need to group and you provide the number of ranges.