2013-03-15 60 views
5

我有使用聚合框架mongo的下列問題。 假設和項目的時間以秒,t和一個事件id發生,如: 項目:{t:11433,e:some_id}mongodb聚合轉換爲int

我想要的是根據t和e聚合。這意味着在時間t內統計id'e'的數量。 使用$ group進行聚合很容易。

但是,我想有一個不同的時間過程。例如,我想在例如一個時間段中統計相同事件ID的數量。 5秒。我可以用js或python編程。我只是想知道是否可以使用mongo,使用羣組級聯。

我嘗試使用$ divide [t,10]進行投影。對於11433,這會給出,1143.3但是,我似乎無法刪除Mongo中的0.3(否則我可以在這個其他範圍內組合)。

任何提示?

感謝

+0

據我所知,沒有聚合。 – 2013-03-16 00:03:09

回答

9

要獲得一個5秒的時間間隔的整組密鑰,您可以使用公式

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

在聚合框架,這將是這樣的:

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

對於此示例集合:

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

結果是:

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