Digamos que tengo una colección de usuarios que almacena la puntuación y el nombre de cada usuario en MongoDB.
al enumerar todos los usuarios, quiero agregarle un nuevo campo para obtener la clasificación del usuario con respecto a la puntuación
Mi solución es:
async findRank() { const users = await User.find().sort({score: -1}) let ObjectOfResults = JSON.parse(JSON.stringify(users)) for (let index = 0; index < ObjectOfResults.length; index++) { ObjectOfResults[index].rank = index } return ObjectOfResults }Así que imagina que tenemos datos muy grandes aquí. ¿Puedo mejorar mi solución usando las operaciones de MongoDB?
Creo que su método es bueno, pero simplemente cambie la longitud de los results.length a la longitud del user.length pero si desea utilizar la operación mongoDB, haga lo siguiente:
db.collection.aggregate([ { "$sort": { "score": -1 } }, { "$group": { "_id": "", "items": { "$push": "$$ROOT" } } }, { "$unwind": { "path": "$items", "includeArrayIndex": "items.rank" } }, { "$replaceRoot": { "newRoot": "$items" } }, { "$sort": { "score": -1 } } ]) puede usar lean() y select algunos campos en la consulta de find para aumentar el rendimiento
async findRank() { const users = await User.find({},"_id score").sort({score: -1}).lean() for (let index = 0; index < users.length; index++) { users[index].rank = index } return users } if you want group by the documents based on name or score ... it's better use mongodb operation