2014-09-04 14 views
7

Sto cercando di implementare una query di gruppo nidificata in mongodb e mi sto bloccando cercando di aggiungere il gruppo esterno per. Dato il seguito (semplificato) documento di dati:Gruppo nidificato MongoDB?

{ 
    "timestamp" : ISODate(), 
    "category" : "movies", 
    "term" : "my movie" 
} 

Sto cercando di ottenere un elenco di tutte le categorie e all'interno delle categorie ci dovrebbe essere il numero superiore di termini. Vorrei che la mia uscita di qualcosa di simile:

[ 
{ category: "movies", 
    terms: [ { term: "movie 1", total: 5000 }, { term: "movie 2", total: 200 } ... ] 
}, 
{ category: "sports", 
    terms: [ { term: "football 1", total: 4000 }, { term: "tennis 2", total: 250 } ... ] 
}, 
] 

mio 'gruppo interno' è come mostrato di seguito, e otterrà la top 5 per tutti categorie:

db.collection.aggregate([ 
    { $match : { "timestamp": { $gt: ISODate("2014-08-27") } } }, 
    { $group : { _id : "$term", total : { $sum : 1 } } }, 
    { $sort : { total : -1 } }, 
    { $limit: 5 } 
]); 

// Outputs: 
{ "_id" : "movie 1", "total" : 943 } 
{ "_id" : "movie 2", "total" : 752 } 

Come potrei fare per implementare il "gruppo esterno"?

Inoltre, a volte il suddetto aggregato] ione restituisce un valore nullo (non tutti i documenti hanno un valore di termine). Come faccio a ignorare i valori nulli?

grazie in anticipo

risposta

12

In questo caso sono necessari due gruppi. Il primo gruppo genera un flusso di documenti con un documento per termine e categoria:

{ $group : { 
     _id : { 
     category: "$category", 
     term: "$term", 
     }, 
     total: { $sum : 1 } 
    } 
} 

Un secondo gruppo sarà quindi unire tutti i documenti con lo stesso termine in una sola, utilizzando l'operatore $push di fondere le categorie in un array:

{ $group : { 
     _id : "$_id.category", 
     terms: { 
      $push: { 
       term:"$_id.term", 
       total:"$total" 
      } 
     } 
    } 
} 
+1

grazie! Questo ha risolto il mio problema, ho aggiunto '{$ sort: {total: -1}}' tra i due gruppi per intero i termini più raggruppati sono in cima, ma non riesco a capire come limitare i termini per dire 5 per categoria. Aggiungere '{$ limit: 6}' tra i gruppi non funziona. (Sto cercando di fare una top 5 termini per query di categoria). Grazie! – clangers

Problemi correlati