2011-01-21 11 views
28

Byłem dla jakiejś pomocy w uzyskaniu najwyższej wartości w kolumnie dla dokumentu mongo. Mogę go posortować i zdobyć górę/dół, ale jestem pewien, że jest lepszy sposób na zrobienie tego.Uzyskiwanie najwyższej wartości kolumny w MongoDB

Próbowałem następujące (i różnych kombinacjach):

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

Ale to wciąż rzuca błędów. Jaki jest dobry sposób na zrobienie tego oprócz sortowania i zdobywania góry/dołu?

Dziękujemy!

+0

Powinieneś uwzględnić błędy, które rzuca. –

Odpowiedz

48

max() nie działa tak, jak można tego oczekiwać w SQL dla Mongo. Być może będzie się to zmieniać w przyszłych wersjach, ale od tej pory maksimum, min, powinno być używane z kluczami indeksowanymi, głównie wewnętrznie do shardowania.

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

Niestety na razie jedyny sposób, aby uzyskać wartość Max jest do sortowania desc zbiórki na tej wartości i wziąć pierwszy.

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

Powinieneś też zrobić. Po pierwsze, po prostu dostaniesz kursor. –

0

Jeśli kolumna jest indeksowana, sortowanie powinno być w porządku, zakładając, że Mongo po prostu używa indeksu do pobrania zamówionej kolekcji. W przeciwnym razie bardziej efektywne będzie iterowanie nad kolekcją, przy zachowaniu najwyższej wartości. na przykład

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

(Przepraszam jeśli mój Ruby trochę ropey, ja nie używany przez dłuższy czas - ale ogólne podejście powinno być jasne z kodu).

+1

Zastanów się, aby powtórzyć z MapReduce !!! To dlatego MongoDB jest fajny, w przeciwnym razie użyj płaskich plików ;-) –

0

Zakładając używałem sterownika Ruby (Widziałem znaczek mongodb-ruby na dole), zrobiłbym coś takiego, gdybym chciał uzyskać maksimum _id (zakładając, że mój _id jest sortowalny). W mojej implementacji mój _id był liczbą całkowitą.

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

Aby uzyskać minimalną _id w kolekcji, wystarczy zmienić :desc do :asc

+0

Czy find_one() nie byłby lepszy niż przy użyciu limitu()? 'result = my_collection.find_one ({},: sort => ['_id',: desc])' – Anurag

19

Sortowanie może być przesadą. Można po prostu zrobić grupę przez

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** } 
      }); 
+3

To jest dokładnie właściwy sposób na zrobienie tego z MongoDB! –

+4

Nie powiedziałbym, że to przesada, biorąc pod uwagę [ten cytat z podręcznika] (http://docs.mongodb.org/manual/reference/operator/aggregation/limit/) * "Kiedy sortowanie $ bezpośrednio poprzedza limit $ w potoku operacja $ sort zachowuje tylko najwyższe wyniki w miarę rozwoju, gdzie n jest określonym limitem "* – aioobe

3

Korzystanie z kruszywa():

db.transactions.aggregate([ 
    {$match: {id: x}}, 
    {$sort: {sellprice:-1}}, 
    {$limit: 1}, 
    {$project: {sellprice: 1}} 
]); 
8
db.collectionName.aggregate(
    { 
    $group : 
    { 
     _id : "", 
     last : 
     { 
     $max : "$sellprice" 
     } 
    } 
    } 
) 
5

Przykładowy kod MongoDB powłoki do obliczania agregatów.

zobaczyć MongoDB ręcznego wprowadzania dla grupy (wielu zastosowaniach) :: http://docs.mongodb.org/manual/reference/aggregation/group/#stage._S_group

poniższa, wymienić $ vars z odbiorem kluczy i kierować zmienną.

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

następujące zapytanie robi to samo: db.student.find({}, {'_id':1}).sort({_id:-1}).limit(1)

Dla mnie ten wytwarzany następujący wynik: { "_id" : NumberLong(10934) }

4

To będzie pracować jak na swoje wymagania.

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

lepiej jest dodać komentarz do Twojego kodu –

Powiązane problemy