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!
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()
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** }
});
db.collectionName.aggregate(
{
$group :
{
_id : "",
last :
{
$max : "$sellprice"
}
}
}
)
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"}
}
}
)
Utiliser aggregate():
db.transactions.aggregate([
{$match: {id: x}},
{$sort: {sellprice:-1}},
{$limit: 1},
{$project: {sellprice: 1}}
]);
Il fonctionnera selon votre condition.
transactions.find("id" => x).sort({"sellprice" => -1}).limit(1).first()
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.)
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
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) }