2014-09-26 8 views
13

Ho un mongodb di circa 400gb. I documenti contengono una varietà di campi, ma la chiave qui è un array di ID.Come aggregare su un enorme array in mongoDB?

Quindi un file JSON potrebbe assomigliare a questo

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

La variabile focale qui è "fondamentale". Ci sono circa 10 miliardi di chiavi totali su 50 milioni di documenti (quindi ogni documento ha circa 200 chiavi). Le chiavi possono essere ripetute e ci sono circa 15 milioni di chiavi UNIQUE.

Quello che mi piacerebbe fare è restituire le 10.000 chiavi più comuni. Pensavo che l'aggregato potesse farlo, ma ho molti problemi a farlo funzionare. Ecco il mio codice:

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

Qualche idea su cosa sto facendo male?

+0

Qual è il problema che hai riscontrato e qual è la versione di MongoDB? – Wizard

+0

Im in esecuzione 2.6.4.L'errore che ottengo è Limite di memoria superato per $ gruppo, – AlexKogan

risposta

35

Prova questo:

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

poi trovare risultare da db.result.find().

+1

Ho provato questo ma ho ricevuto questo errore: "eccezione: limite di memoria superato per $ gruppo, ma non ha permesso l'ordinamento esterno. Pass allowDiskUse: true per attivare. " Il che è strano visto che suppongo di aver optato per l'utilizzo della seconda parte del codice. HMMM – AlexKogan

+0

@AlexKogan, È davvero strano. Potresti incollare qui i tuoi codici? – Wizard

+0

Eccolo! db.users.aggregate ( [ {$ rilassarsi: "$ piace"}, {$ gruppo: {_id: "$ piace", numero: {$ sum: 1}}}, {$ sorta: {numero: -1}}, {$ limite: 10000}, {$ out: "risultato"}, ], { allowDiskUse: vero, cursore: {}} ) – AlexKogan