2013-03-15 15 views
5

Ich habe das folgende Problem mit Mongo mit dem Aggregation Framework. Angenommen und Artikel mit der Zeit in Sekunden, t, und ein Ereignis-ID auftritt, e, wie: Artikel: {t: 11433, e: some_id}Mongodb Aggregation in int

, was ich will, ist nach t und e aggregieren. Es bedeutet, die Anzahl von id 'e' in einer Zeit t zu zählen. Dies ist einfach mit der Aggregation mit $ Gruppe zu tun.

Allerdings hätte ich gerne einen anderen Zeitverlauf. Zum Beispiel möchte ich die Nummer der gleichen Ereignis-ID in einem Zeitfenster von z. 5 Sekunden. Ich könnte das progammatisch machen, in js oder python. Ich habe mich nur gefragt, ob es funktionieren könnte, wenn man nur Mongo benutzt, indem man eine Kaskade von Gruppen benutzt.

Ich versuchte, mit $ divide [t, 10] zu projizieren. Für 11433 würde dies ergeben, 1143.3 Aber es scheint, dass ich die 0.3 in Mongo nicht entfernen kann (Sonst könnte ich in dieser anderen Skala gruppieren).

Irgendwelche Hinweise?

dank

+0

nicht so weit in der Aggregation, wie ich weiß. –

Antwort

9

Um einen ganzzahligen Gruppenschlüssel für ein 5-Sekunden-Intervall zu erhalten, können Sie die Formel

t = t - (t % 5) // % is the modula operator 

Im Aggregations Framework verwenden, um dies würde wie folgt aussehen:

db.xx.aggregate([ 
    // you need two projections, as they can not be nested 
    // this does not work: 
    // { $project: { _id: 0, e: 1, t: 1, tk: { $subtract: [ "$t", $mod: [ "$t", 5 ] ] } } }, 
    // 
    // get modula 5 of time in seconds: 
    { $project: { _id: 0, e: 1, t: 1, tm5: { $mod: [ "$t", 5 ] } } }, 
    // subtract it from time: 
    { $project: { _id: 0, e: 1, ti: { $subtract: [ "$t", "$tm5" ] } } }, 
    // now group on e and interval, 
    { $group: { _id: { e: "$e", interval: "$ti" }, count: { $sum: 1 } } }, 
]) 

Für dieses Beispielsammlung:

> db.xx.find() 
{ "_id" : ObjectId("515e5a7157a0887a97cc8d1d"), "t" : 11433, "e" : "some_id" } 
{ "_id" : ObjectId("515e60d457a0887a97cc8d1e"), "t" : 11434, "e" : "some_id" } 
{ "_id" : ObjectId("515e60d857a0887a97cc8d1f"), "t" : 11438, "e" : "some_id" } 

das Ergebnis:

{ 
    "result" : [ 
     { 
      "_id" : { 
       "e" : "some_id", 
       "interval" : 11435 
      }, 
      "count" : 1 
     }, 
     { 
      "_id" : { 
       "e" : "some_id", 
       "interval" : 11430 
      }, 
      "count" : 2 
     } 
    ], 
    "ok" : 1 
}