MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Entonnoir linéaire à partir d'une collection d'événements avec agrégation MongoDB, est-ce possible ?

J'ai rédigé une réponse complète sur mon blog MongoDB mais en résumé, ce que vous avez à faire est de projeter vos actions en fonction de celles qui vous intéressent pour mapper les valeurs du champ d'action dans les noms de clé appropriés, grouper par personne agrégeant pour les trois actions quand ils les ont faites (et éventuellement combien de fois ) puis projetez de nouveaux champs qui vérifient si l'action2 a été effectuée après l'action1, et l'action3 a été effectuée après l'action2... La dernière phase résume simplement le nombre de personnes qui ont fait juste 1, ou 1 puis 2, ou 1 puis 2 et puis 3.

En utilisant une fonction pour générer le pipeline d'agrégation, il est possible de générer des résultats basés sur un tableau d'actions transmises.

Dans mon cas de test, l'ensemble du pipeline s'est exécuté en moins de 200 ms pour une collection de 40 000 documents (c'était sur mon petit ordinateur portable).

Comme cela a été correctement souligné, la solution générale que je décris suppose que, bien qu'un acteur puisse effectuer n'importe quelle action plusieurs fois, il ne peut qu'avancer de l'action1 à l'action2 mais qu'il ne peut pas passer directement de l'action1 à l'action3 (interprétant l'ordre d'action comme décrivant les conditions préalables où vous ne pouvez pas faire l'action3 tant que vous n'avez pas fait l'action2).

En fin de compte, le cadre d'agrégation peut être utilisé même pour des séquences d'événements où l'ordre est complètement arbitraire, mais vous voulez toujours savoir combien de personnes à un moment donné ont fait la séquence action1, action2, action3.

Le principal ajustement à apporter à la réponse d'origine consiste à ajouter une étape supplémentaire en deux étapes au milieu. Cette étape déroule le document collecté par personne pour le regrouper en trouvant la première occurrence de la deuxième action qui vient après la première occurrence de la première action.

Une fois que nous avons cela, la comparaison finale devient pour l'action1, suivie de la première occurrence de l'action2 et la compare à la dernière occurrence de l'action3.

Il peut probablement être généralisé pour gérer un nombre arbitraire d'événements, mais chaque événement supplémentaire après deux ajouterait deux étapes supplémentaires à l'agrégation.

Voici ma rédaction de la modification du pipeline pour obtenir la réponse que vous recherchez.