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 sûr qu'il y a une meilleure façon de le faire.

J'ai essayé ce qui suit (et différentes combinaisons):

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

Mais il continue à lancer des erreurs. Quelle est une bonne façon de le faire en plus de trier et d'obtenir le Haut / Bas?

Merci!

28
demandé sur Tim Cooper 2011-01-21 22:32:13

9 réponses

Max () ne fonctionne pas comme vous le feriez en 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 sharding.

Voir http://www.mongodb.org/display/DOCS/min+et+Max + requête + spécificateurs

, Malheureusement, pour l'instant, la seule façon d'obtenir la valeur max est de trier la collection desc sur cette valeur et de prendre le premier.

transactions.find("id" => x).sort({"sellprice" => -1}).limit(1).first()
48
répondu Michael Papile 2013-02-19 16:31:26

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

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
répondu Mayur Rustagi 2011-11-25 14:00:21
db.collectionName.aggregate(
  {
    $group : 
    {
      _id  : "",
      last : 
      {
        $max : "$sellprice"
      }
    }
  }
)
8
répondu user2418693 2013-06-16 07:05:48

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

Voir l'entrée manuelle 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
répondu jatal 2013-06-05 22:30:51

Utiliser aggregate():

db.transactions.aggregate([
  {$match: {id: x}},
  {$sort: {sellprice:-1}},
  {$limit: 1},
  {$project: {sellprice: 1}}
]);
3
répondu Vincent 2013-05-23 20:13:55

Il fonctionnera selon votre condition.

transactions.find("id" => x).sort({"sellprice" => -1}).limit(1).first()
3
répondu Shariq Ansari 2015-05-05 08:45:47

Si la colonne est indexée, un tri devrait être correct, 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 prenant note de la plus grande valeur vue. 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 ropey, Je ne l'ai pas utilisé depuis longtemps - mais l'approche générale devrait être claire à partir du code.)

0
répondu Simon Whitaker 2011-01-21 20:32:10

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 en :asc

0
répondu briangonzalez 2011-09-20 15:36:58

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
répondu Manish 2014-11-03 16:23:46