2013-03-15 34 views
5

Tôi có vấn đề sau với mongo bằng cách sử dụng khung tổng hợp. Giả sử và mục có thời gian tính bằng giây, t và id sự kiện xảy ra, e, như: mục: {t: 11433, e: some_id}tập hợp mongodb cast vào int

điều tôi muốn tổng hợp theo t và e. Nó có nghĩa là đếm số id 'e' trong một thời gian t. Điều này dễ thực hiện bằng cách sử dụng tập hợp với $ nhóm.

Tuy nhiên, tôi muốn có một khóa học thời gian khác. Ví dụ, tôi muốn đếm số cùng một id sự kiện trong một khe thời gian ví dụ. 5 giây. Tôi có thể làm điều này một cách progammatically, trong js hoặc python. Tôi đã tự hỏi liệu nó có thể hoạt động bằng cách sử dụng chỉ mongo, bằng cách sử dụng một loạt các nhóm.

Tôi đã cố gắng sử dụng $ divide [t, 10]. Đối với 11433, điều này sẽ cung cấp cho, 1143.3 Nhưng có vẻ như tôi không thể loại bỏ 0.3 trong Mongo (Nếu không tôi có thể nhóm trong quy mô khác này).

Bất kỳ gợi ý nào?

nhờ

+0

Không kết hợp theo như tôi biết. –

Trả lời

9

Để có được một chìa khóa nhóm số nguyên cho một khoảng thời gian 5 giây, bạn có thể sử dụng công thức

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

Trong khuôn khổ hợp này sẽ trông như thế này:

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

Cho bộ sưu tập mẫu này:

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

kết quả là:

{ 
    "result" : [ 
     { 
      "_id" : { 
       "e" : "some_id", 
       "interval" : 11435 
      }, 
      "count" : 1 
     }, 
     { 
      "_id" : { 
       "e" : "some_id", 
       "interval" : 11430 
      }, 
      "count" : 2 
     } 
    ], 
    "ok" : 1 
} 
Các vấn đề liên quan