Wie gruppiert man Mongodb-Zeitpunktinformationen in zusammenhängende Zeitgruppen?

8

Ich habe eine Sammlung von Entscheidungsdokumenten in ähnlicher Form wie:

%Vor%

Ich habe Mühe, eine Möglichkeit zu finden, diese Dokumente in Gruppen von zusammenhängenden Datumsangaben zu gruppieren. I.e. Ein Dokument sollte zu einer bestimmten Gruppe gehören, wenn es weniger als etwa 5 Minuten von mindestens einem anderen Dokument in der Gruppe entfernt ist.

Ziel ist es, Gruppen von Entscheidungen zu erreichen, die in einer "Sitzung" getroffen wurden. Zu diesen "Session" -Gruppen könnten dann weitere Erkenntnisse durch Aggregation (wie durchschnittliche Zeit pro Entscheidung usw.) gewonnen werden.

Falls dies mit dem Aggreagation-Framework von MongoDb nicht möglich ist, kann dies mit Map-Reduce oder auf andere Weise geschehen. Ich bin offen für Vorschläge.

Erläuterung

Eine andere Möglichkeit, sich das Problem vorzustellen, ist die Anwendung des folgenden Algorithmus auf die Sammlung von Dokumenten.

  1. Starten Sie , indem Sie die Dokumente in die Reihenfolge "Datum / Uhrzeit" setzen.
  2. Geben Sie das früheste Dokument an, das (chronologisch) zuerst kommt Gruppe und gehen Sie zum nächsten Dokument.
  3. Wenn das nächste Dokument eine datetime hat, die weniger als eine angegebene Zeit nach dem unmittelbar vorhergehenden one (sagen wir 5 Minuten) auftritt, platzieren Sie dieses in der gleichen Gruppe wie zuvor. Wenn nicht, erstellt eine neue Gruppe und legt dieses Dokument dort ab.
  4. Wiederholen Sie Schritt 3. bis alle Dokumente durchlaufen wurden.

Dies würde die Sammlung mit den erforderlichen "Sitzungsgruppierungen" verlassen. Natürlich ist dies nur eine Möglichkeit, sich das Problem vorzustellen. Ich bin mir nicht bewusst, wie ich eine geordnete Sammlung durchqueren kann, während ich MongoDb auf diese Weise gruppiere.

Kann es so gemacht werden? Gibt es eine andere Möglichkeit, dasselbe Ergebnis mit MongoDb zu erzielen?

    
Chris 05.09.2016, 15:27
quelle

1 Antwort

1

Nach dem von Ihnen beschriebenen Algorithmus hängt die Gruppierungslogik für jedes Dokument immer von einem anderen Dokument ab. Ich sehe keine Möglichkeit, dies mit Map Reduce, Aggregation oder einer einzelnen MongoDB-Abfrage zu tun. Die einzige Lösung, die ich sehe, besteht darin, streng Ihren Algorithmus zu befolgen, dh jedes Dokument zu lesen und die Entscheidung zu treffen, ob es zur aktuellen Gruppe gehört oder ob es in einer neuen Gruppe sein sollte.

Es wird nicht empfohlen, alle Dokumente in den Speicher zu laden, da dies eine sehr große Sammlung sein kann. Also habe ich einen Stream verwendet, um Dokument für Dokument zu laden.

Erstellen Sie einen Cursor, der alle Dokumente findet und sortiert sie nach dem Datum und verwenden Sie dann cursor.on('data', function(document){ ... }); , um jedes Dokument einzeln zu lesen.

%Vor%

Für diese Dokumente

%Vor%

Das letzte Gruppenobjekt ist

%Vor%

BEARBEITEN

Da die Logik zum Gruppieren immer das letzte gelesene Dokument ist, habe ich den Algorithmus für die Anpassung geändert. Auch jetzt aktualisiert es jedes Dokument mit einem Gruppenschlüssel, so dass nicht alle Dokumente im Speicher geladen werden.

%Vor%

Danach können Sie die Gruppierung verwenden, um Dokumente nach Gruppen zu gruppieren

%Vor%

Dies erzeugt ein Ergebnis wie:

%Vor%     
Marcelo Risse 06.10.2016 00:52
quelle