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

Lineær tragt fra en samling begivenheder med MongoDB-aggregering, er det muligt?

Jeg skrev et fuldstændigt svar på min MongoDB-blog men som en opsummering, hvad du skal gøre er at projicere dine handlinger baseret på, hvilke du interesserer dig for, for at kortlægge værdier af handlingsfelt i passende nøglenavne, gruppe for person, der samler for de tre handlinger, da de udførte dem (og eventuelt hvor mange gange ) og projekter derefter nye felter, som tjekker, om handling2 blev udført efter handling1, og handling3 blev udført efter handling2... Sidste fase opsummerer bare antallet af personer, der kun gjorde 1, eller 1 og derefter 2, eller 1 og derefter 2 og derefter 3.

Ved at bruge en funktion til at generere aggregeringspipelinen er det muligt at generere resultater baseret på række af handlinger, der er sendt ind.

I mit testtilfælde løb hele pipelinen på under 200 ms for en samling på 40.000 dokumenter (dette var på min lille bærbare computer).

Som det korrekt blev påpeget, antager den generelle løsning, jeg beskriver, at mens en aktør kan foretage enhver handling flere gange, kan de kun gå videre fra handling1 til handling2, men at de ikke kan springe direkte fra handling1 til handling3 (fortolker handlingsrækkefølge som en beskrivelse af forudsætninger, hvor du kan ikke udføre handling3, før du har udført handling2).

Som det viser sig, kan aggregeringsramme bruges selv til sekvenser af hændelser, hvor rækkefølgen er fuldstændig vilkårlig, men du stadig vil vide, hvor mange mennesker på et tidspunkt udførte sekvensen action1, action2, action3.

Den vigtigste justering, der skal foretages på det originale svar, er at tilføje et ekstra to-trins trin i midten. Dette trin afvikler det indsamlede af persondokument for at omgruppere det og finder den første forekomst af den anden handling, der kommer efter den første forekomst af den første handling.

Når vi har det, bliver den endelige sammenligning for handling1, efterfulgt af den tidligste forekomst af handling2 og sammenligne den med den seneste forekomst af handling3.

Det kan sandsynligvis generaliseres til at håndtere et vilkårligt antal hændelser, men hver yderligere hændelse efter to ville tilføje yderligere to trin til aggregeringen.

Her er min opskrivning af ændringen af ​​rørledningen for at opnå det svar, du leder efter.




  1. Laravel App kører ikke på xampp eller live server, men fungerer godt på php artisan serve

  2. Journalfiler findes i journalbiblioteket, men starter dog uden at journalføring er aktiveret

  3. Gem referencefelt mongoengine

  4. MongoDB-as-a-Service i Canada