sql >> Databasteknik >  >> NoSQL >> MongoDB

Linjär tratt från en samling händelser med MongoDB-aggregation, är det möjligt?

Jag skrev ett fullständigt svar på min MongoDB-blogg men som en sammanfattning, vad du måste göra är att projicera dina handlingar baserat på vilka du bryr dig om för att kartlägga värden i åtgärdsfältet till lämpliga nyckelnamn, grupp för person sammanställande för de tre åtgärderna när de gjorde dem (och eventuellt hur många gånger ) och sedan projicera nya fält som kontrollerar om åtgärd2 gjordes efter åtgärd1, och åtgärd3 gjordes efter åtgärd2... Förra fasen summerar bara antalet personer som bara gjorde 1, eller 1 och sedan 2, eller 1 och sedan 2 och sedan 3.

Genom att använda en funktion för att generera aggregeringspipeline är det möjligt att generera resultat baserat på en rad åtgärder som skickas in.

I mitt testfall sprang hela pipelinen på under 200 ms för en samling av 40 000 dokument (detta var på min lilla bärbara dator).

Som det korrekt påpekades, förutsätter den allmänna lösningen jag beskriver att medan en aktör kan vidta vilken åtgärd som helst flera gånger, så kan den bara gå vidare från åtgärd1 till åtgärd2 men att de inte kan hoppa direkt från åtgärd1 till åtgärd3 (tolkar åtgärdsordning som en beskrivning av förutsättningar där du kan inte göra åtgärd3 förrän du har gjort åtgärd2).

Som det visar sig kan aggregeringsramverket användas även för sekvenser av händelser där ordningen är helt godtycklig men du fortfarande vill veta hur många personer som vid något tillfälle gjorde sekvensen action1, action2, action3.

Den huvudsakliga justeringen att göra på det ursprungliga svaret är att lägga till ett extra tvåstegssteg i mitten. Detta steg lindar upp dokumentet som samlats in av person för att omgruppera det och hitta den första förekomsten av den andra åtgärden som kommer efter den första förekomsten av den första åtgärden.

När vi väl har det blir den slutliga jämförelsen för action1, följt av den tidigaste förekomsten av action2 och jämför den med den senaste förekomsten av action3.

Det kan förmodligen generaliseras för att hantera godtyckliga antal händelser, men varje ytterligare händelse efter två skulle lägga till ytterligare två steg till aggregeringen.

Här är min beskrivning av ändringen av pipelinen för att få det svar du letar efter.




  1. 2 Helm Charts med delat Redis-beroende

  2. Kan inte ansluta från JAVA till Mongo SSL Replica Set

  3. Bästa sättet att läsa och uppdatera mongodb-dokument med pymongo

  4. MongoDB-fråga, hitta allt efter användar-ID