2013-03-15 19 views
5

Mam następujący problem z Mongo przy użyciu struktury agregacji. Załóżmy i pozycja z czasem w sekundach, T, oraz Identyfikator zdarzenia występujące, e, jak: pozycji: {t: 11433, e: some_id}Agregacja mongodów oddanych do int

co chcę jest do agregowania według ti e. Oznacza to zliczanie numeru id 'e' w czasie t. Jest to łatwe do zrobienia przy użyciu agregacji z grupą $.

Chciałbym jednak wybrać inny kurs czasowy. Na przykład chcę policzyć numer identyfikatora tego samego zdarzenia w przedziale czasowym np. 5 sekund. Mogłem to zrobić progamicznie, w js lub python. Właśnie zastanawiałem się, czy to może działać, używając tylko mongo, używając kaskady grupy.

Próbowałem zaprojektować za pomocą podziału $ [t, 10]. W przypadku 11433 dałoby to 1143,3. Wydaje się jednak, że nie mogę usunąć 0,3 w Mongo (w przeciwnym razie mógłbym zgrupować w tej innej skali).

Dowolna podpowiedź?

dzięki

+0

Brak agregacji, o ile wiem. –

Odpowiedz

9

Aby uzyskać klucz grupy całkowitą dla przedziale 5-sekundowym, można użyć formuły

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

W ramach agregacji to będzie wyglądać następująco:

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 } } }, 
]) 

Dla tej przykładowej kolekcji:

> 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" } 

Wynikiem jest:

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