Cómo calcular el rango de los puntos totales en la tubería agregada para la aplicación de juegos

Estoy trabajando en la aplicación de juegos que tendré miles de usuarios.

Mi salida actual de tubería agregada

[ { "USERID": "U0004", "Total_Points": 10 }, { "USERID": "U0001", "Total_Points": 8 }, { "USERID": "U0006", "Total_Points": 8 }, { "USERID": "U0002", "Total_Points": 2 }, { "USERID": "U0003", "Total_Points": 1 }, { "USERID": "U0005", "Total_Points": 1 } ] 

Rendimiento esperado

 [ { "USERID": "U0004", "Total_Points": 10, "Rank": 1 }, { "USERID": "U0001", "Total_Points": 8, "Rank": 2 }, { "USERID": "U0006", "Total_Points": 8, "Rank": 2 }, { "USERID": "U0002", "Total_Points": 2, "Rank": 4 }, { "USERID": "U0003", "Total_Points": 1, "Rank": 5 }, { "USERID": "U0005", "Total_Points": 1, "Rank": 5 } ] 

Cuál es la forma mejor y más optimizada de obtener la salida de mongodb agregate con el concepto de clasificación de la tabla de clasificación.

Estoy utilizando la conexión mongodb mongoose en mi proyecto.

Puedo manipular los datos usando un bucle for, pero parece bastante ineficiente.

Gracias por adelantado.

Los comentarios son muy apreciados.

A continuación se muestra una imagen de ejemplo de tabla de líderes

enlazar

Esto es lo que se me ocurrió.

 var users = [ { "USERID": "U0001", "Total_Points": 8 }, { "USERID": "U0004", "Total_Points": 10 }, { "USERID": "U0003", "Total_Points": 1 }, { "USERID": "U0006", "Total_Points": 8 }, { "USERID": "U0002", "Total_Points": 2 }, { "USERID": "U0005", "Total_Points": 1 } ]; users.sort((a, b) => b.Total_Points - a.Total_Points); for (let i = 0; i < users.length; i++) { let totalPoints = users[i].Total_Points; let usersWithRank = users.filter(user => user.Total_Points === totalPoints); for (let user of usersWithRank) { user.Rank = i + 1; } i += usersWithRank.length - 1; } console.log(users); 

No creas que puedes hacer esto con el agregado.

Puedes hacerlo en una sola línea con javascript. Ordena tu matriz y luego mapea para obtener el rango con el índice.

  a = [ { "USERID": "U0004", "Total_Points": 10 }, { "USERID": "U0001", "Total_Points": 8 }, { "USERID": "U0006", "Total_Points": 8 }, { "USERID": "U0002", "Total_Points": 2 }, { "USERID": "U0003", "Total_Points": 1 }, { "USERID": "U0005", "Total_Points": 1 } ] a = a.sort(function(a, b){ return b.Total_Points - a.Total_Points; }).map(function(e, i){ e.Rank = (i + 1); return e; }); {USERID: "U0004", Total_Points: 10, Rank: 1} {USERID: "U0001", Total_Points: 8, Rank: 2} {USERID: "U0006", Total_Points: 8, Rank: 3} {USERID: "U0002", Total_Points: 2, Rank: 4} {USERID: "U0003", Total_Points: 1, Rank: 5} {USERID: "U0005", Total_Points: 1, Rank: 6}