2014-09-26 14 views
13

Mam monondbę około 400 gb. Dokumenty zawierają różne pola, ale kluczem jest tutaj tablica identyfikatorów.Jak agregować na ogromnej tablicy w mongoDB?

Więc plik json może wyglądać następująco

{ 
"name":"bob" 
"dob":"1/1/2011" 
"key": 
     [ 
     "102", 
     "1234123222", 
     "5021297723" 
     ] 
} 

Zmienna ogniskowa Oto „klucz”. Istnieje około 10 miliardów kluczy ogółem w 50 milionach dokumentów (więc każdy dokument ma około 200 kluczy). Klucze można powtórzyć, a istnieje około 15 milionów kluczy UNIQUE.

Co chciałbym zrobić, to zwrócić 10 000 najczęściej używanych kluczy. Myślałem, że agregacja może to zrobić, ale mam wiele problemów z uruchomieniem tego. Oto mój kod:

db.users.aggregate( 
[ 
    { $unwind : "$key" }, 
    { $group : { _id : "$key", number : { $sum : 1 } } }, 
    { $sort : { number : -1 } }, 
    { $limit : 10000 } 
] 
); 

Jakieś pomysły, co robię źle?

+0

Jakie problemy napotkałeś i jaka jest wersja Twojego MongoDB? – Wizard

+0

Im działa 2.6.4. Błąd, który dostaję, to Przekroczono limit pamięci dla $ group, – AlexKogan

Odpowiedz

35

Spróbuj tego:

db.users.aggregate( 
[ 
    { $unwind : "$key" }, 
    { $group : { _id : "$key", number : { $sum : 1 } } }, 
    { $sort : { number : -1 } }, 
    { $limit : 10000 }, 
    { $out:"result"}, 
], { 
    allowDiskUse:true, 
    cursor:{} 
} 
); 

Następnie znajdź prowadzić przez db.result.find().

+1

Próbowałem tego, ale dostałem ten błąd: "wyjątek: Przekroczono limit pamięci dla grupy $, ale nie zezwalałem na sortowanie zewnętrzne." "Allow allowDiskUse: true" się włączyć. " Co jest dziwne, ponieważ zakładam, że skorzystałem z drugiej części twojego kodu. HMMM – AlexKogan

+0

@AlexKogan, To naprawdę dziwne. Czy możesz tutaj wkleić swoje kody? – Wizard

+0

Oto jest! db.users.aggregate ( [ {$ odpoczynek: "$ lubi"}, {$ grupa : {_id: "$ lubi", numer: {$ suma: 1}}}, {$ sortowania: {numer -1}} {$ granica: 10000} {$ z "wynik"} ] { allowDiskUse: prawda kursor {} } ) – AlexKogan

Powiązane problemy