2013-04-18 11 views
9

Sto cercando di ottenere un elenco del numero di record con matrici di dimensioni variabili. Voglio ottenere la distribuzione delle dimensioni di matrice per tutti i record in modo da poter costruire un istogramma come questo:Il modo più veloce per ottenere l'istogramma delle dimensioni degli array utilizzando il framework di aggregazione MongoDB

  | * 
      | * 
documents | *   * 
      | * *  * 
      |_*__*__*___*__*___ 
      2 5 6 23 47 

       Array Size 

Così i documenti prime simile a questa:

{hubs : [{stuff:0, id:6}, {stuff:1"}, .... ]} 
{hubs : [{stuff:0, id:6}]}` 

Finora utilizzando il quadro aggregazione e alcuni dei aiuto here mi è venuta in mente

db.sitedata.aggregate([{ $unwind:'$hubs'}, 
         { $group : {_id:'$_id', count:{$sum:1}}}, 
         { $group : {_id:'$count', count:{$sum:1}}}, 
         { $sort : {_id: 1}}]) 

Questo sembra darmi i risultati che voglio, ma non è molto veloce. Mi chiedo se c'è qualcosa che posso fare in questo modo che potrebbe non aver bisogno di due chiamate di gruppo. La sintassi è sbagliato qui, ma quello che sto cercando di fare è mettere il valore di conteggio nel primo campo _id:

db.sitedata.aggregate([{ $unwind:'$hubs'}, 
         { $group : {_id:{$count:$hubs}, count:1}}, 
         { $sort : { _id: 1 }}]) 
+0

non c'è un modo per farlo in un passaggio perché non è possibile iniziare a contare/raggruppare i risultati fino a quando non si termina il conteggio del primo raggruppamento. Quale versione di MongoDB stai usando? –

+0

a proposito, quanto tempo ci vuole? –

+0

Ok, ho il sospetto che potrebbe essere il caso (nidificazione non consentita, solo concatenamento). Ci vogliono circa 4 secondi, il che non è male ma speravo al secondo. Posso modificare i miei dati invece di modificare la query ora. – Scott

risposta

5

Ora che 2,6 è fuori, quadro aggregazione supporta una new array operator $size, che vi permetterà di $project la dimensione dell'array senza dover srotolare e ri-raggruppare.

db.sitedata.aggregate([{ $project:{ 'count': { '$size':'$hubs'} } }, 
         { $group : {_id:'$count', count:{$sum:1} } }, 
         { $sort : { _id: 1 } } ]) 
Problemi correlati