Na moim blogu MongoDB napisałem kompletną odpowiedź ale podsumowując, musisz zaprojektować swoje działania na podstawie tych, na których Ci zależy, aby zmapować wartości pola działania na odpowiednie nazwy kluczy, pogrupować według osoby agregując trzy działania, kiedy je wykonały (i opcjonalnie ile razy ), a następnie zaprojektuj nowe pola, które sprawdzają, czy akcja 2 została wykonana po akcji 1, a akcja 3 została wykonana po akcji 2... Ostatnia faza po prostu sumuje liczbę osób, które wykonały tylko 1, lub 1, a następnie 2, lub 1, a następnie 2 i następnie 3.
Używając funkcji do generowania potoku agregacji, możliwe jest generowanie wyników na podstawie tablicy przekazanych akcji.
W moim przypadku testowym cały potok trwał mniej niż 200 ms dla kolekcji 40 000 dokumentów (było to na moim małym laptopie).
Jak słusznie wskazano, opisywane przeze mnie rozwiązanie ogólne zakłada, że chociaż aktor może wielokrotnie wykonać dowolne działanie, to może jedynie przejść od działania 1 do działania 2, ale nie może przejść bezpośrednio od działania 1 do działania 3 (interpretując kolejność działania jako opis warunków, w których nie możesz wykonać działania 3, dopóki nie wykonasz działania 2).
Jak się okazuje, framework agregacji może być używany nawet w przypadku sekwencji zdarzeń, których kolejność jest całkowicie dowolna, ale nadal chcesz wiedzieć, ile osób w pewnym momencie wykonało sekwencję akcja1, akcja2, akcja3.
Główną zmianą, jaką należy wprowadzić w oryginalnej odpowiedzi, jest dodanie dodatkowego dwustopniowego kroku pośrodku. Ten krok rozwija dokument zebrany przez osobę, aby ponownie go pogrupować, odnajdując pierwsze wystąpienie drugiego działania, które następuje po pierwsze wystąpienie pierwszej akcji.
Kiedy już to zrobimy, ostateczne porównanie staje się dla działania1, po którym następuje najwcześniejsze wystąpienie działania2 i porównaj to z ostatnim wystąpieniem działania3.
Prawdopodobnie można uogólnić obsługę dowolnej liczby zdarzeń, ale każde dodatkowe zdarzenie po dwóch dodałoby dwa kolejne etapy do agregacji.
Oto moje modyfikacja potoku aby uzyskać odpowiedź, której szukasz.