ruby mongodb mongodb-ruby

ruby - Obtener el valor más alto de una columna en MongoDB



mongodb-ruby (9)

Código de shell mongodb de ejemplo para calcular agregados.

consulte la entrada manual de mongodb para el grupo (muchas aplicaciones) :: http://docs.mongodb.org/manual/reference/aggregation/group/#stage._S_group

A continuación, reemplace los $ vars con su clave de colección y la variable de destino.

db.activity.aggregate( { $group : { _id:"$your_collection_key", min: {$min : "$your_target_variable"}, max: {$max : "$your_target_variable"} } } )

He estado en busca de ayuda para obtener el valor más alto en una columna para un documento mongo. Puedo ordenar y obtener la parte superior / inferior, pero estoy bastante seguro de que hay una mejor manera de hacerlo.

Probé las siguientes (y diferentes combinaciones):

transactions.find("id" => x).max({"sellprice" => 0})

Pero sigue tirando errores. ¿Cuál es una buena manera de hacerlo además de clasificar y obtener la parte superior / inferior?

¡Gracias!


Funcionará según su requisito.

transactions.find("id" => x).sort({"sellprice" => -1}).limit(1).first()


La clasificación podría ser una exageración. Solo puedes hacer un grupo por

db.messages.group( {key: { created_at:true }, cond: { active:1 }, reduce: function(obj,prev) { if(prev.cmax<obj.created_at) prev.cmax = obj.created_at; }, initial: { cmax: **any one value** } });


La siguiente consulta hace lo mismo: db.student.find({}, {''_id'':1}).sort({_id:-1}).limit(1)

Para mí, esto produjo el siguiente resultado: { "_id" : NumberLong(10934) }


Si la columna está indexada, entonces una ordenación debería estar bien, asumiendo que Mongo solo usa el índice para obtener una colección ordenada. De lo contrario, es más eficiente iterar sobre la colección, teniendo en cuenta el mayor valor visto. p.ej

max = nil coll.find("id" => x).each do |doc| if max == nil or doc[''sellprice''] > max then max = doc[''sellprice''] end end

(Pido disculpas si mi Ruby está un poco mal, no lo he usado durante mucho tiempo, pero el enfoque general debe quedar claro en el código).


Suponiendo que estaba usando el controlador Ruby (vi una etiqueta mongodb-ruby en la parte inferior), haría algo como lo siguiente si quisiera obtener el máximo _id (suponiendo que mi _id sea ​​ordenable). En mi implementación, mi _id era un entero.

result = my_collection.find({}, :sort => [''_id'', :desc]).limit(1)

Para obtener el _id mínimo en la colección, solo cambia :desc a :asc


Utilice agregado ():

db.transactions.aggregate([ {$match: {id: x}}, {$sort: {sellprice:-1}}, {$limit: 1}, {$project: {sellprice: 1}} ]);


max () no funciona de la forma que se esperaría en SQL para Mongo. Quizás esto vaya a cambiar en futuras versiones, pero a partir de ahora, max, min se usarán con claves indexadas principalmente de forma interna para sharding.

vea http://www.mongodb.org/display/DOCS/min+and+max+Query+Specifiers

Desafortunadamente, por ahora, la única forma de obtener el valor máximo es ordenar la colección desc en ese valor y tomar la primera.

transactions.find("id" => x).sort({"sellprice" => -1}).limit(1).first()


db.collectionName.aggregate( { $group : { _id : "", last : { $max : "$sellprice" } } } )