2016-04-14 3 views
0

Auf einer kleinen Testseite möchte ich den ungefähren Zeitraum protokollieren, den ein Benutzer aktiv für bestimmte Linkgruppen pro Tag verbringt. Thereofore auf jedem Benutzer klicken i ein Dokument wie folgt speichern:Sortieren und Aufsummieren von Zeiträumen in Mongo

Beispiel Dokument:

{ 
"routeGroup": "a", 
"time": new Date() 
} 

Die Idee ist, alle Dokumente eines bestimmten Tages zu filtern, diese Art von Zeit und gibt die kontinuierliche Zeitdauer Ein Benutzer hat für eine routeGroup ausgegeben.

Beispiel:

folgende Dokumente Given (bereits nach Tag sortiert und durch die Zeit gefiltert):

{"routegroup": "a", "time": 11:30:00}, 
{"routegroup": "a", "time": 11:31:00}, 
{"routegroup": "a", "time": 11:32:00}, 

{"routegroup": "b", "time": 11:33:00}, 
{"routegroup": "b", "time": 11:34:00}, 

{"routegroup": "a", "time": 11:35:00}, 

{"routegroup": "b", "time": 11:36:00}, 

{"routegroup": "a", "time": 11:37:00}, 
{"routegroup": "a", "time": 11:38:00}, 
{"routegroup": "a", "time": 11:39:00} 

So ist der Benutzer 3 Minuten in Gruppe zuerst verbringen hat "a" gefolgt von 2 Minuten in Gruppe "b", 1 Minute in Gruppe "a" und so weiter.

Diese Zeiträume sind empfindlich bis zu Sekunden und ich würde dann summieren und das Rück wie so etwas wie:

// total time spend in routeGroups on day x 

{"routegroup": "a", "timeTotal": "7:00"}, 
{"routegroup": "b", "timeTotal": "3:00"} 

Frage: Ist das möglich und wenn ja, wie?

Vielen Dank im Voraus für Ihre Hilfe!

Muff

+0

Wenn es einen Artikel für jede Minute protokolliert, dann brauchen Sie nur die Gesamtzahl pro Gruppe! Ja? Erwarten Sie nicht, dass die Aggregation im Browser-Client-Code effizient erfolgt. Dies ist ein Job für den Server, und wenn Sie das Problem auf seine einfache Bedeutung herunterbrechen, dann sind die sehr einfachen Antworten leicht zu finden. –

+0

Das Intervall von Minuten, die ich zu Demonstrationszwecken gewählt habe - Sekunden sollten ebenfalls berücksichtigt werden. Die Abfrage wird auf dem Server ausgeführt. – Raggamuffin

+0

Wie @NeilLunn sagte, wenn Ihr Protokollierungsintervall konstant ist (sei es X Minuten oder X Sekunden), ist die Antwort nur die Gesamtzahl pro Gruppe. Die Frage ist also, ob das Intervall für Ereignisse konstant oder variabel ist. – joao

Antwort

1

Die Aggregation Framework können Sie Ihre erwartete Antwort geben:

db.times.aggregate([ 
    {$group: {_id: '$routegroup', timeTotal: {$sum : 1}}}, 
    {$project: {_id: 0, routegroup: '$_id', timeTotal: 1}} 
]) 

Dies davon aus, dass jeder Datensatz ungefähr 1 Minute der Benutzeraktivität gespeichert ist und dass Sie mit dem Gesamt meistens sind besorgt Zeit pro Tag, anstatt maximale kontinuierliche Zeit (die Ihre Frage/erwartetes Ergebnis ist der Fall)

+0

Danke, aber das Intervall von Minuten habe ich einfach gewählt, um das Beispiel zu vereinfachen. Der 'timeTotal' sollte für Sekunden sinnvoll sein. – Raggamuffin

+0

Ich sehe ... Können Sie Ihr Schema so ändern, dass routegroup pro Besuch eindeutig ist, zB {"routegroup": "a", visitId: 1, "time": 11:30:00}, {"routegroup": "a", visitId: 1, "time": 11:31:00}, {"routegroup": "a", visitId: 1, "Uhrzeit": 11:32:00}, {"routegroup": "b", visitId: 2, "time": 11:33:00}, {"routegroup": "b", visitId: 2, "Uhrzeit": 11:34:00} usw. Dann würdest du in der Lage sein, die Abfrage so zu gruppieren, dass sie gruppiert und Min/Max-Werte auswählt und die Unterschiede berechnet. Wenn nicht, würde ich denken, dass Sie dies außerhalb von mongodb auf Ihrem Client tun müssten, sobald Sie die sortierte Liste haben –

+0

Ah ok, so dass jeder Block von Einträgen der gleichen Gruppe eine ID bekommen - ich werde versuchen, danke! – Raggamuffin

Verwandte Themen