sql >> Base de Datos >  >> NoSQL >> MongoDB

Embudo lineal de una colección de eventos con agregación MongoDB, ¿es posible?

Escribí una respuesta completa en mi blog de MongoDB pero como resumen, lo que tiene que hacer es proyectar sus acciones en función de las que le interesan para mapear los valores del campo de acción en nombres clave apropiados, agrupar por persona agregando para las tres acciones cuándo las realizó (y opcionalmente cuántas veces ) y luego proyecte nuevos campos que verifiquen si la acción 2 se realizó después de la acción 1 y la acción 3 se realizó después de la acción 2... La última fase simplemente resume el número de personas que hicieron solo 1, o 1 y luego 2, o 1 y luego 2 y luego 3.

Usando una función para generar la canalización de agregación, es posible generar resultados basados ​​en una serie de acciones pasadas.

En mi caso de prueba, la canalización completa se ejecutó en menos de 200 ms para una colección de 40 000 documentos (esto estaba en mi pequeña computadora portátil).

Como se señaló correctamente, la solución general que describo supone que, si bien un actor puede realizar cualquier acción varias veces, solo puede avanzar de la acción 1 a la acción 2, pero no puede saltar directamente de la acción 1 a la acción 3 (interpretando el orden de acción como descripción de requisitos previos donde no puedes hacer la acción 3 hasta que hayas hecho la acción 2).

Resulta que el marco de agregación se puede usar incluso para secuencias de eventos donde el orden es completamente arbitrario, pero aún desea saber cuántas personas en algún momento realizaron la secuencia action1, action2, action3.

El ajuste principal que se debe hacer en la respuesta original es agregar un paso adicional de dos etapas en el medio. Este paso desenrolla el documento recopilado por persona para reagruparlo encontrando la primera aparición de la segunda acción que viene después la primera aparición de la primera acción.

Una vez que tengamos eso, la comparación final se convierte en acción1, seguida de la primera aparición de acción2 y la comparamos con la última aparición de acción3.

Probablemente se pueda generalizar para manejar un número arbitrario de eventos, pero cada evento adicional después de dos agregaría dos etapas más a la agregación.

Aquí está mi artículo sobre la modificación de la tubería para lograr la respuesta que buscas.