update sort findbyidandupdate example delete attribute javascript mongodb mongoose mapreduce

javascript - sort - Obtener la ubicación del documento en la colección según el orden de clasificación



mongoose sort (2)

Es posible hacer esto con mapReduce , pero requiere que tenga un índice en el campo ordenado, por lo que primero, si ya no lo hizo:

db.highscores.ensureIndex({ "score": -1 })

Entonces puedes hacer esto:

db.highscores.mapReduce( function() { emit( null, this.user ); }, function(key,values) { return values.indexOf("User12") + 1; }, { "sort": { "score": -1 }, "out": { "inline": 1 } } )

O varíe eso a la información que necesita para devolver que no sea simplemente la posición de "clasificación". Pero dado que básicamente se trata de poner todo en un gran conjunto que ya ha sido ordenado por puntaje, entonces probablemente no será el mejor rendimiento para un tamaño razonable de datos.

Una mejor solución sería mantener una colección separada de "clasificaciones", que puede actualizar periódicamente con mapReduce, aunque no reduzca nada:

db.highscores.mapReduce( function() { ranking++; emit( ranking, this ); }, function() {}, { "sort": { "score": -1 }, "scope": { "ranking": 0 }, "out": { "replace": "rankings" } } )

Luego puede consultar esta colección para obtener sus resultados:

db.rankings.find({ "value.user": "User12 })

Entonces eso contendría el ranking como "emitido" en el campo _id de la colección de "clasificaciones".

Soy nuevo en MongoDB (+ Mangosta). Tengo una colección de puntuaciones altas con documentos que se ven así:

{id: 123, user: ''User14'', score: 101} {id: 231, user: ''User10'', score: 400} {id: 412, user: ''User90'', score: 244} {id: 111, user: ''User12'', score: 310} {id: 221, user: ''User88'', score: 900} {id: 521, user: ''User13'', score: 103} + thousands more...

ahora estoy obteniendo los mejores 5 jugadores así:

highscores .find() .sort({''score'': -1}) .limit(5) .exec(function(err, users) { ...code... });

Lo cual es genial, pero también me gustaría hacer una consulta como "¿Qué ubicación tiene user12 en la lista de user12 ?"

¿Es posible lograrlo con una consulta de alguna manera?


Si no tiene que obtener la ubicación en tiempo real, la respuesta de Neil Lunn es perfecta. Pero si su aplicación siempre tiene datos para insertar en esta colección, para los nuevos datos, no puede obtener la ubicación para ella.

Aquí hay otra solución:

En primer lugar, agrega un índice en el puntaje de campo en esta colección. Luego use query db.highscores.count({score:{$gt: user''s score}) . Contará los documentos cuya puntuación sea mayor que el objetivo. Este número es la ubicación.