Посмотрите, соответствует ли это вашим требованиям.
Пояснение
Агрегирование Mongodb предлагает больше аналитических операций для вычисления данных. С помощью операции $facet
мы можем вычислить несколько агрегаций в одном.
Мы вычисляем минимальные / максимальные значения для salary
и age
. Затем мы вычисляем процент для каждого salary
и age
с помощью этой формулы
x − min
---------- x 100
max − min
С помощью $switch
мы определяем 4 варианта: менее 25, меньше 50, меньше 75 и больше хан 75
db.collection.aggregate([
{
$facet: {
extremes: [
{
$group: {
_id: null,
maxAge: {
$max: "$age"
},
minAge: {
$min: "$age"
},
maxSalary: {
$max: "$salary"
},
minSalary: {
$min: "$salary"
}
}
}
],
root: [
{
$match: {}
}
]
}
},
{
$set: {
extremes: {
$arrayElemAt: [
"$extremes",
0
]
}
}
},
{
$unwind: "$root"
},
{
$addFields: {
root: {
agePercent: {
$toInt: {
$multiply: [
{
$divide: [
{
$subtract: [
"$root.age",
"$extremes.minAge"
]
},
{
$subtract: [
"$extremes.maxAge",
"$extremes.minAge"
]
}
]
},
100
]
}
},
salaryPercent: {
$toInt: {
$multiply: [
{
$divide: [
{
$subtract: [
"$root.salary",
"$extremes.minSalary"
]
},
{
$subtract: [
"$extremes.maxSalary",
"$extremes.minSalary"
]
}
]
},
100
]
}
}
}
}
},
{
$replaceWith: "$root"
},
{
$project: {
age: {
$switch: {
branches: [
{
case: {$lt: ["$agePercent",25]},
then: "less than 25 percent"
},
{
case: {$lt: ["$agePercent",50]},
then: "less than 50 percent"
},
{
case: {$lt: ["$agePercent",75]},
then: "less than 75 percent"
},
{
case: {$gte: ["$agePercent",75]},
then: "more than 75 percent"
}
],
default: "Unknown"
}
},
salary: {
$switch: {
branches: [
{
case: {$lt: ["$salaryPercent",25]},
then: "less than 25 percent"
},
{
case: {$lt: ["$salaryPercent",50]},
then: "less than 50 percent"
},
{
case: {$lt: ["$salaryPercent",75]},
then: "less than 75 percent"
},
{
case: {$gte: ["$salaryPercent",75]},
then: "more than 75 percent"
}
],
default: "Unknown"
}
}
}
}
])
MongoPlayground