MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Funnel lineare da una raccolta di eventi con aggregazione MongoDB, è possibile?

Ho scritto una risposta completa sul mio blog MongoDB ma in sintesi, quello che devi fare è proiettare le tue azioni in base a quelle che ti interessano per mappare i valori del campo dell'azione in nomi chiave appropriati, raggruppando per persona aggregando per le tre azioni quando le hanno eseguite (e facoltativamente quante volte ) e quindi proiettare nuovi campi che controllano se l'azione2 è stata eseguita dopo l'azione1 e l'azione3 è stata eseguita dopo l'azione2... L'ultima fase riassume semplicemente il numero di persone che hanno fatto solo 1, o 1 e poi 2, o 1 e poi 2 e quindi 3.

Utilizzando una funzione per generare la pipeline di aggregazione, è possibile generare risultati in base alla matrice di azioni passate.

Nel mio test case, l'intera pipeline è stata eseguita in meno di 200 ms per una raccolta di 40.000 documenti (questo era sul mio piccolo laptop).

Come è stato correttamente sottolineato, la soluzione generale che descrivo presuppone che mentre un attore può compiere qualsiasi azione più volte, può solo avanzare dall'azione1 all'azione2 ma che non può saltare direttamente dall'azione1 all'azione3 (interpretando l'ordine dell'azione come una descrizione dei prerequisiti in cui non puoi fare l'azione3 finché non hai fatto l'azione2).

A quanto pare, il framework di aggregazione può essere utilizzato anche per sequenze di eventi in cui l'ordine è completamente arbitrario ma vuoi comunque sapere quante persone a un certo punto hanno eseguito la sequenza action1, action2, action3.

L'aggiustamento principale da apportare alla risposta originale è aggiungere un ulteriore passaggio in due fasi nel mezzo. Questo passaggio srotola il documento raccolto per persona per riorganizzarlo trovando la prima occorrenza della seconda azione che viene dopo la prima occorrenza della prima azione.

Una volta ottenuto che il confronto finale diventa per action1, seguito dalla prima occorrenza di action2 e confrontalo con l'ultima occorrenza di action3.

Probabilmente può essere generalizzato per gestire un numero arbitrario di eventi, ma ogni evento aggiuntivo dopo due aggiungerebbe altre due fasi all'aggregazione.

Ecco il mio articolo su la modifica della pipeline per ottenere la risposta che stai cercando.