sql >> Database >  >> NoSQL >> MongoDB

Lineaire trechter van een verzameling evenementen met MongoDB-aggregatie, is het mogelijk?

Ik schreef een compleet antwoord op mijn MongoDB-blog maar als een samenvatting, wat u moet doen, is uw acties projecteren op basis van de acties die u belangrijk vindt om waarden van actieveld toe te wijzen aan de juiste sleutelnamen, groeperen per persoon voor de drie acties wanneer ze ze deden (en optioneel hoe vaak ) en vervolgens nieuwe velden projecteren die controleren of actie2 werd uitgevoerd na actie1, en actie3 werd uitgevoerd na actie2... De laatste fase somt gewoon het aantal mensen op dat slechts 1, of 1 en dan 2, of 1 en dan 2 en dan 3.

Door een functie te gebruiken om de aggregatiepijplijn te genereren, is het mogelijk om resultaten te genereren op basis van een reeks doorgegeven acties.

In mijn testcase liep de hele pijplijn onder de 200 ms voor een verzameling van 40.000 documenten (dit stond op mijn kleine laptop).

Zoals terecht werd opgemerkt, veronderstelt de algemene oplossing die ik beschrijf dat hoewel een actor elke actie meerdere keren kan uitvoeren, hij alleen van actie1 naar actie2 kan gaan, maar dat hij niet rechtstreeks van actie1 naar actie3 kan springen (waarbij de actievolgorde wordt geïnterpreteerd als het beschrijven van voorwaarden je kunt action3 pas doen als je action2) hebt gedaan.

Het blijkt dat het aggregatieraamwerk zelfs kan worden gebruikt voor reeksen van gebeurtenissen waarbij de volgorde volledig willekeurig is, maar u toch wilt weten hoeveel mensen op een bepaald moment de reeks actie1, actie2, actie3 hebben uitgevoerd.

De belangrijkste aanpassing aan het oorspronkelijke antwoord is het toevoegen van een extra stap in twee fasen in het midden. Met deze stap wordt het verzamelde document per persoon afgewikkeld om het opnieuw te groeperen en de eerste keer te vinden van de tweede actie die na komt het eerste optreden van de eerste actie.

Zodra we dat hebben, wordt de laatste vergelijking voor actie1, gevolgd door het vroegste optreden van actie2 en vergelijk dat met het laatste optreden van actie3.

Het kan waarschijnlijk worden gegeneraliseerd om een ​​willekeurig aantal gebeurtenissen te verwerken, maar elke extra gebeurtenis na twee zou twee extra fasen aan de aggregatie toevoegen.

Hier is mijn verslag van de wijziging van de pijplijn om het antwoord te krijgen waarnaar u op zoek bent.




  1. Mongo-aggregatieraamwerk:wat is het slotniveau van de $out-operatie in de laatste fase?

  2. Importeer CSV-bestanden uit een map om een ​​database op Rails te seeden

  3. Standaarddatabase instellen voor MongoDB-shell

  4. Hoe php7 te verbinden met mongoDB