2010-05-12 6 views
20

Ich brauche etwas etwas Komplexeres als die Beispiele in den MongoDB-Dokumenten und ich kann nicht in der Lage sein, meinen Kopf darum zu wickeln.MongoDB-Map verwenden/auf zwei Felder "gruppieren" reduzieren

sagen, dass ich eine Sammlung von Objekten des Formulars {date: "2010-10-10", type: "EVENT_TYPE_1", user_id: 123, ...} haben

Jetzt möchte ich etwas ähnliches wie eine SQL GROUP BY-Abfrage erhalten, Datum und Art sowohl über die Gruppierung. Das heißt, ich möchte die Anzahl der Ereignisse jedes Typs an jedem Tag. Außerdem möchte ich es durch user_id eindeutig machen, dh. Wenn ein Benutzer mehrere Ereignisse am selben Tag hat, muss er nur einmal gezählt werden.

Ich versuche, dies mit map/reduce zu tun.

ich

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; 
    } 
) 

die schön Gruppen nach Typ, aber jetzt, wie kann ich Gruppe von Datum zugleich? Scheint, dass der Schlüssel in emit() kein Array sein kann (ich dachte daran, emit([this.date, this.type], 1) zu tun). Wie kann ich die Benutzerfreundlichkeit sicherstellen?

Ich beginne gerade mit MongoDB und habe immer noch Probleme, die grundlegenden Konzepte zu verstehen. Außerdem gibt es dort nicht viel Dokumentation. Jede Hilfe von erfahreneren Benutzern wird geschätzt. Vielen Dank!

+0

couchdb kann Arrays als Schlüssel tun, nur sagen – dominic

Antwort

19

Eine sehr gute Lösung im MongoDB-Kochbuch gefunden (kannte diese Ressource vorher nicht).

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

Grundsätzlich durch mehrere Schlüssel-Gruppe, verwenden Sie eine dict, keine Liste (wie ich versucht). Um einzigartige Ergebnisse zu erhalten, müssen Sie zwei Karten-/Reduzierungs-Pässe erstellen.

+3

Link funktioniert nicht. Jeder, der über wenige Felder gruppieren/emittieren möchte, kann folgende Struktur verwenden: emit ({date: this.date, type: this.type}, 1) –

Verwandte Themen