Как я понял из вашего вопроса, вы хотите дать оценку на основе баллов. Пока еще нет прямого оператора для получения ранга документов MongoDB. Но есть обходной путь, который будет хорошо работать для тех коллекций, где значение в поле, для которого требуется рассчитать ранг, не одинаково для более чем 2 документов или если можно иметь разные ранги для одного и того же значения, кратного документы.
[
{ $sort: { score_day: -1 } },
{ $group: { _id: null, data: { $push: "$$ROOT" } } },
{ $unwind: { path: "$data", includeArrayIndex: "rank_day" } },
{ $addFields: { "data.rank_day": { $add: [ "$rank_day", 1 ] } } },
{ $replaceRoot: { newRoot: "$data" } },
{ $sort: { score_month: -1 } },
{ $group: { _id: null, data: { $push: "$$ROOT" } } },
{ $unwind: { path: "$data", includeArrayIndex: "rank_month" } },
{ $addFields: { "data.rank_month": { $add: [ "$rank_month", 1 ] } } },
{ $replaceRoot: { newRoot: "$data" } },
{ $sort: { score_year: -1 } },
{ $group: { _id: null, data: { $push: "$$ROOT" } } },
{ $unwind: { path: "$data", includeArrayIndex: "rank_year" } },
{ $addFields: { "data.rank_year": { $add: [ "$rank_year", 1 ] } } },
{ $replaceRoot: { newRoot: "$data" } }
]
Приведенный выше конвейер даст вам ранг на основе оценки, но если существует более 1 документа с одинаковым значением оценки, тогда ранг будет назначен в соответствии с порядком вхождения в конвейер.
Чтобы избежать такой степени, что вы можете сделать, это сложить все баллы и получить общий балл, а затем вы можете отсортировать его на основе баллов за день / месяц / год вместе с общим баллом, который поможет вам получить немного больше соответствующих рангов. Это не поможет, если количество баллов за день / неделю / год совпадает с общим баллом для более чем одного документа. Если вы согласны с приведенным выше сценарием, вы можете использовать приведенный ниже конвейер.
[
{ $addFields: { overAllScore: { $add: [ "$score_day", "$score_month", "$score_year" ] } } },
{ $sort: { score_day: -1, overAllScore: -1 } },
{ $group: { _id: null, data: { $push: "$$ROOT" } } },
{ $unwind: { path: "$data", includeArrayIndex: "rank_day" } },
{ $addFields: { "data.rank_day": { $add: [ "$rank_day", 1 ] } } },
{ $replaceRoot: { newRoot: "$data" } },
{ $sort: { score_month: -1, overAllScore: -1 } },
{ $group: { _id: null, data: { $push: "$$ROOT" } } },
{ $unwind: { path: "$data", includeArrayIndex: "rank_month" } },
{ $addFields: { "data.rank_month": { $add: [ "$rank_month", 1 ] } } },
{ $replaceRoot: { newRoot: "$data" } },
{ $sort: { score_year: -1, overAllScore: -1 } },
{ $group: { _id: null, data: { $push: "$$ROOT" } } },
{ $unwind: { path: "$data", includeArrayIndex: "rank_year" } },
{ $addFields: { "data.rank_year": { $add: [ "$rank_year", 1 ] } } },
{ $replaceRoot: { newRoot: "$data" } }
]
Наконец, вы можете добавить этап проекта, чтобы исключить поля оценки, чтобы показать только необходимые данные.