2010-05-12 5 views
20

Ho bisogno di qualcosa di leggermente più complesso degli esempi nei documenti MongoDB e non riesco a riuscire a capirlo.Uso della mappa di MongoDB/riduzione a "raggruppa per" due campi

Dire che ho una collezione di oggetti della forma {date: "2010-10-10", type: "EVENT_TYPE_1", user_id: 123, ...}

Ora voglio ottenere qualcosa di simile a un gruppo SQL di query, il raggruppamento sia su data e tipo. Cioè, voglio il numero di eventi di ogni tipo in ogni giorno. Inoltre, mi piacerebbe renderlo unico da user_id, vale a dire. se un utente ha più eventi nello stesso giorno, contarli solo una volta.

Sto provando a farlo con la mappa/riduci.

faccio

db.logs.mapReduce( 
    function() { 
     emit(this.type, 1); 
    }, 
    function(k, vals) { 
     var total = 0; 
     for (var i = 0; i < vals.length; i++) 
      total += vals[i]; 
     return total; 
    } 
) 

che ben gruppi in base al tipo, ma ora, come faccio di gruppo in base alla data, allo stesso tempo? Sembra che la chiave in emit() non possa essere una matrice (ho pensato di fare emit([this.date, this.type], 1)). Inoltre, come posso garantire l'unicità per utente?

Sto appena iniziando con MongoDB e sto ancora avendo problemi ad afferrare i concetti di base. Inoltre, non c'è molta documentazione disponibile là fuori. È apprezzato qualsiasi aiuto da parte di utenti più esperti. Grazie!

+0

couchdb può eseguire matrici come chiavi, basta dire ' – dominic

risposta

19

Trovato una buona soluzione nel libro di cucina MongoDB (non conoscevo questa risorsa prima).

http://cookbook.mongodb.org/patterns/unique_items_map_reduce/

In sostanza, al gruppo da più chiavi, si utilizza un dict, non una lista (come ho cercato). Inoltre, per ottenere risultati unici, è necessario effettuare due passaggi mappa/riduzione.

+3

Link non funziona. Chiunque sia interessato a raggruppare/emettere su pochi campi può utilizzare la seguente struttura: emetta ({date: this.date, type: this.type}, 1) –