Eu escrevi uma resposta completa no meu blog MongoDB mas resumindo, o que você precisa fazer é projetar suas ações com base em quais você se importa para mapear os valores do campo de ação em nomes de chave apropriados, grupo por pessoa agregando as três ações quando elas as fizeram (e opcionalmente quantas vezes ) e então projetam novos campos que verificam se a ação2 foi feita após a ação1, e a ação3 foi feita após a ação2... então 3.
Usando uma função para gerar o pipeline de agregação, é possível gerar resultados com base na matriz de ações passadas.
No meu caso de teste, todo o pipeline foi executado em menos de 200 ms para uma coleção de 40.000 documentos (isso estava no meu pequeno laptop).
Como foi corretamente apontado, a solução geral que descrevo pressupõe que, embora um ator possa executar qualquer ação várias vezes, ele só pode avançar da ação1 para a ação2, mas não pode pular diretamente da ação1 para a ação3 (interpretando a ordem da ação como descrevendo pré-requisitos onde você não pode fazer a ação3 até que tenha feito a ação2).
Como se vê, a estrutura de agregação pode ser usada até mesmo para sequências de eventos em que a ordem é completamente arbitrária, mas você ainda quer saber quantas pessoas em algum momento fizeram a sequência action1, action2, action3.
O principal ajuste a ser feito na resposta original é adicionar uma etapa extra de dois estágios no meio. Esta etapa desenrola o documento coletado por pessoa para reagrupá-lo, encontrando a primeira ocorrência da segunda ação que vem depois a primeira ocorrência da primeira ação.
Uma vez que temos que a comparação final se torna para ação1, seguida pela primeira ocorrência de ação2 e comparamos com a última ocorrência de ação3.
Provavelmente pode ser generalizado para lidar com um número arbitrário de eventos, mas cada evento adicional após dois adicionaria mais dois estágios à agregação.
Aqui está meu relato de a modificação do pipeline para obter a resposta que procura.