Если вы хотите сделать это в одном запросе, попробуйте один из следующих двух:
Запрос 1:
db.collection.aggregate([
{
$group: {
_id: "",
maxRating: { $max: "$rating" },
minRating: { $min: "$rating" },
data: { $push: "$$ROOT" },
},
},
{
$unwind: "$data",
},
{
$addFields: {
"data.normalizedRating": {
$divide: [
{ $subtract: ["$data.rating", "$minRating"] },
{ $subtract: ["$maxRating", "$minRating"] },
],
},
},
},
{
$replaceRoot: { newRoot: "$data" },
},
]);
Тест: MongoDB-площадка
Запрос 2:
db.collection.aggregate([
{
$facet: {
data: [{ $match: {} }],
ratingValues: [
{
$group: {
_id: "",
maxRating: { $max: "$rating" },
minRating: { $min: "$rating" },
},
},
],
},
},
{
$unwind: "$data",
},
{
$unwind: "$ratingValues",
},
{
$addFields: {
"data.normalizedRating": {
$divide: [
{ $subtract: ["$data.rating", "$ratingValues.minRating"] },
{ $subtract: ["$ratingValues.maxRating", "$ratingValues.minRating"] },
],
},
},
},
{
$project: { ratingValues: 0 },
},
{
$replaceRoot: { newRoot: "$data" },
},
]);
Тест: MongoDB-площадка
В конце дня, если ваш набор данных средний, они могут работать хорошо, но на огромных наборах данных они могут или не могут работать хорошо - я бы сказал, разделить эту задачу на две части, чтобы сделать некоторые работать в коде или с несколькими вызовами, если это действительно необходимо, или попытаться реализовать ту же задачу, используя mapReduce , если агрегация действительно медленная.