2014-09-26 13 views
13

Yaklaşık 400 gramlık bir mongodb var. Belgeler çeşitli alanlar içerir, ancak burada anahtar bir dizi kimliktir.mongoDB'deki büyük dizide nasıl toplanır?

Yani bir json dosyası odak değişken burada "anahtar" bu

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

gibi görünebilir. 50 milyon belgede yaklaşık 10 milyar toplam anahtar vardır (bu nedenle her belgenin yaklaşık 200 tuşu vardır). Tuşlar tekrarlanabilir ve yaklaşık 15 milyon UNIQUE anahtar vardır.

Yapmak istediğim 10.000 en sık kullanılan anahtarı döndürmektir. Toplamın bunu yapabileceğini sanıyordum, ama koşmak için çok fazla sorun yaşıyorum. İşte benim kodum:

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

Herhangi bir fikrim yanlış yaptığım var mı?

+0

Karşılaştığınız sorun nedir ve MongoDB'nizin sürümü nedir? – Wizard

+0

Im çalıştırıyorum 2.6.4.Hata alıyorum $ grup için aşıldı bellek sınırı, – AlexKogan

cevap

35

bu deneyin:

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

Sonra bulmak db.result.find() tarafından sonuçlanır.

+1

Bunu denedim ama bu hatayı aldım: "exception: $ group için bellek sınırı aşıldı, ancak harici sort izin vermedi. Pass allowDiskUse: true seçmek için. " Kodunuzun ikinci bölümünü kullanmayı tercih ettiğimi varsaydığımdan beri garip olanı. HMMM – AlexKogan

+0

@AlexKogan, Bu gerçekten garip. Kodlarını buraya yapıştırır mısın? – Wizard

+0

İşte işte! db.users.aggregate ( [ {$ açma "$ sever"}, {{$ toplamı: sayı "$ sever": $ grubu: {_ID 1}}} {$ sıralama: {sayısı: -1}} {$ sınırı: 10000} {$ üzerinden: "sonuç"}, ], { allowDiskUse: doğru, imleç: {} } ) – AlexKogan

İlgili konular