Napsal jsem kompletní odpověď na svůj blog MongoDB ale jako shrnutí, co musíte udělat, je promítnout své akce na základě toho, o které z nich vám záleží, namapovat hodnoty pole akcí do příslušných názvů klíčů, seskupit po osobách agregující tři akce, kdy je provedli (a volitelně i kolikrát ) a poté promítněte nová pole, která zkontrolují, zda byla akce 2 provedena po akci 1 a akce 3 byla provedena po akci 2... Poslední fáze pouze sčítá počet lidí, kteří udělali jen 1, nebo 1 a pak 2, nebo 1 a pak 2 a pak 3.
Pomocí funkce pro generování agregačního kanálu je možné generovat výsledky na základě řady předávaných akcí.
V mém testovacím případě běžel celý kanál za méně než 200 ms pro sbírku 40 000 dokumentů (toto bylo na mém malém notebooku).
Jak bylo správně zdůrazněno, obecné řešení, které popisuji, předpokládá, že zatímco aktér může provést jakoukoli akci vícekrát, může postoupit pouze z akce1 do akce2, ale nemůže přímo přeskakovat z akce1 do akce3 (interpretuje pořadí akcí jako popis předpokladů, kde nemůžete provést akci3, dokud neprovedete akci2).
Jak se ukázalo, agregační rámec lze použít i pro sekvence událostí, kde je pořadí zcela libovolné, ale přesto chcete vědět, kolik lidí v určitém okamžiku provedlo sekvenci akce1, akce2, akce3.
Hlavní úpravou původní odpovědi je přidání dalšího dvoustupňového kroku uprostřed. Tento krok rozbalí dokument shromážděný osobou, aby se znovu seskupil a našel první výskyt druhé akce, která následuje po první výskyt první akce.
Jakmile máme, že konečné srovnání se stane pro akci1, následovanou nejdříve výskytem akce2 a porovnáme ji s nejnovějším výskytem akce3.
Pravděpodobně lze zobecnit zpracování libovolného počtu událostí, ale každá další událost po dvou by přidala do agregace další dvě fáze.
Zde je můj zápis úprava potrubí abyste dosáhli odpovědi, kterou hledáte.