2012-08-15 7 views
26

Na przykład, nie jest zbiorem tak:
Jak skutecznie wykonywać "różne" za pomocą wielu kluczy?

{rynek: 'SH', kod: '000001', data: '2012-01-01', cena: 1000} {rynek
: "SZ", kod: "000001", data: "2012-01-01", cena: 1000}
{rynek: "SH", kod: "000001", data: "2012-01-02", cena: 1000}
{rynek: 'SZ', kod: '000001', data: '2012-01-02', cena: 1000}
{rynek: 'SH', kod: '000002', data: "2012-01-03", cena: 1000}
...

Ta kolekcja zawiera dziesiątki milionów dokumentów.

chcę zadzwonić odrębny z dwoma kluczami:

collection.distinct('market', 'code'); 

i uzyskać wynik:

[{rynek: 'SH', kod: '000001'}, {rynek: 'SZ', kod: '000001'}, { rynek: 'SH', kod: '000002'}]

jako natywne wyraźnym poleceniem przyjąć tylko jeden klucz, staram się realizować za pomocą map-reduce. Ale redukcja map jest o wiele za wolna, aby rodzimy się wyróżniał. W moim kluczowym, odrębnym teście, mapa zmniejsza wydatki o dziesięć razy dłuższe niż rodzime.
Czy istnieje skuteczny sposób na wyróżnienie różnych wersji?

Odpowiedz

53

Jeśli jesteś gotów czekać na nadchodzący 2,2 wydaniu MongoDB, można uruchomić tę kwerendę efektywne wykorzystanie ram agregacji:

collection = db.tb; 
result = collection.aggregate( 
      [ 
       {"$group": { "_id": { market: "$market", code: "$code" } } } 
      ] 
     ); 
printjson(result); 

Na milionów rekord zbierania na moim komputerze testowym, to prowadził w 4 sekundy, podczas gdy wersja map/reduce zajęła ponad minutę.

Powiązane problemy