web-dev-qa-db-fra.com

Obtenir la valeur la plus élevée d'une colonne dans MongoDB

J'ai demandé de l'aide pour obtenir la valeur la plus élevée sur une colonne pour un document mongo. Je peux le trier et obtenir le haut/bas, mais je suis presque sûr qu'il existe une meilleure façon de le faire.

J'ai essayé les combinaisons suivantes (et différentes):

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

Mais il continue de lancer des erreurs. Quel est un bon moyen de le faire en plus de trier et d'obtenir le haut/bas?

Je vous remercie!

28
roloenusa

max () ne fonctionne pas comme vous vous en doutez dans SQL pour Mongo. Cela va peut-être changer dans les futures versions mais à partir de maintenant, max, min doivent être utilisés avec des clés indexées principalement en interne pour le partitionnement.

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

Malheureusement, pour l'instant, la seule façon d'obtenir la valeur maximale est de trier la collection desc sur cette valeur et de prendre la première.

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

Le tri peut être excessif. Vous pouvez simplement faire un groupe en

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** }
            });
19
Mayur Rustagi
db.collectionName.aggregate(
  {
    $group : 
    {
      _id  : "",
      last : 
      {
        $max : "$sellprice"
      }
    }
  }
)
8
user2418693

Exemple de code shell mongodb pour le calcul des agrégats.

voir l'entrée manuelle de mongodb pour le groupe (nombreuses applications) :: http://docs.mongodb.org/manual/reference/aggregation/group/#stage._S_group

Dans ce qui suit, remplacez les $ vars par votre clé de collection et votre variable cible.

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

Cela fonctionnera selon votre condition.

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

Utilisez l'agrégat ():

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

En supposant que j'utilisais le pilote Ruby (j'ai vu une balise mongodb-Ruby en bas), je ferais quelque chose comme ceci si je voulais obtenir le maximum _id (en supposant que mon _id est triable). Dans mon implémentation, mon _id était un entier.

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

Pour obtenir le minimum _id dans la collection, changez simplement :desc à :asc

0
briangonzalez

Si la colonne est indexée, un tri doit être OK, en supposant que Mongo utilise simplement l'index pour obtenir une collection ordonnée. Sinon, il est plus efficace d'itérer sur la collection, en tenant compte de la plus grande valeur observée. par exemple.

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

(Toutes mes excuses si mon Ruby est un peu louche, je ne l'ai pas utilisé depuis longtemps - mais l'approche générale devrait être claire d'après le code.)

0
Simon Whitaker

La requête suivante fait la même chose: db.student.find({}, {'_id':1}).sort({_id:-1}).limit(1)

Pour moi, cela a produit le résultat suivant: { "_id" : NumberLong(10934) }

0
Manish