MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Linearer Trichter aus einer Sammlung von Ereignissen mit MongoDB-Aggregation, ist das möglich?

Ich habe eine vollständige Antwort in meinem MongoDB-Blog Zusammenfassend müssen Sie jedoch Ihre Aktionen auf der Grundlage derjenigen projizieren, die Ihnen wichtig sind, um die Werte des Aktionsfelds geeigneten Schlüsselnamen zuzuordnen, gruppieren Sie nach Person und aggregieren Sie die drei Aktionen, als sie sie ausgeführt haben (und optional, wie oft). ) und dann neue Felder projizieren, die prüfen, ob Aktion2 nach Aktion1 und Aktion3 nach Aktion2 ausgeführt wurde ... In der letzten Phase wird nur die Anzahl der Personen zusammengefasst, die nur 1 oder 1 und dann 2 oder 1 und dann 2 und ausgeführt haben dann 3.

Durch die Verwendung einer Funktion zum Generieren der Aggregationspipeline ist es möglich, Ergebnisse basierend auf einem Array von übergebenen Aktionen zu generieren.

In meinem Testfall lief die gesamte Pipeline für eine Sammlung von 40.000 Dokumenten in weniger als 200 ms (dies war auf meinem kleinen Laptop).

Wie richtig darauf hingewiesen wurde, geht die von mir beschriebene allgemeine Lösung davon aus, dass ein Akteur zwar jede Aktion mehrmals ausführen kann, aber nur von Aktion1 zu Aktion2 vorrücken kann, aber nicht direkt von Aktion1 zu Aktion3 springen kann (wobei die Aktionsreihenfolge als Beschreibung der Voraussetzungen interpretiert wird wo Sie können Aktion3 nicht ausführen, bis Sie Aktion2 ausgeführt haben).

Wie sich herausstellt, kann das Aggregationsframework sogar für Abfolgen von Ereignissen verwendet werden, bei denen die Reihenfolge völlig willkürlich ist, Sie aber trotzdem wissen möchten, wie viele Personen irgendwann die Abfolge Aktion1, Aktion2, Aktion3 ausgeführt haben.

Die wichtigste Anpassung an der ursprünglichen Antwort besteht darin, einen zusätzlichen zweistufigen Schritt in der Mitte hinzuzufügen. Dieser Schritt wickelt das nach Personen gesammelte Dokument ab, um es neu zu gruppieren und das erste Vorkommen der zweiten Aktion zu finden, die nach kommt das erste Vorkommen der ersten Aktion.

Sobald wir das haben, wird der letzte Vergleich für Aktion1, gefolgt vom frühesten Auftreten von Aktion2, und vergleichen Sie dies mit dem letzten Auftreten von Aktion3.

Es kann wahrscheinlich verallgemeinert werden, um eine beliebige Anzahl von Ereignissen zu verarbeiten, aber jedes zusätzliche Ereignis nach zwei würde der Aggregation zwei weitere Stufen hinzufügen.

Hier ist mein Bericht von die Modifikation der Pipeline um die gesuchte Antwort zu erhalten.