2012-10-26 174 views
2

在MongoDB中我有一個集合:MongoDB的彙總查詢

Statistics 
{ 
    UserID: int   //User id 
    Url: string   //Url 
    Clicks: [DateTime] //A time array  
} 

當用戶點擊的URL添加在點擊陣列點擊日期的日期。我的問題是我怎麼能寫彙總查詢等獲得的點擊數,這是從[日期1]至[日期2]和組通過用戶名?如何將文件輸出到文件?

謝謝!

+0

你的用戶名的意思是「組」作爲分組的行或「集團」,如排序,因此所有通過一個用戶標識的網址位於結果集的相同區域中? – Sammaye

+0

我的意思是組和排序不一樣。它就像SQL命令GROUP BY一樣。 –

+0

我認爲你的一些模式是在這裏失蹤COS:「得到一個數字,這是從[日期1]至[日期2]點擊」但你有沒有號碼,點擊字段是一個日期時間字段不是整數字段顯示點擊次數和之後你只有URL字段。你的日期字段的名稱是什麼? – Sammaye

回答

4

假設你有一個這樣的數據(見底部如何生成此):

{ "_id": ObjectId("508ab0e27bb16229520c9561"), "userid": 0, "url": "", "clickDate": ISODate("20120101T12:01:00Z") } 
{ "_id": ObjectId("508ab0e27bb16229520c9562"), "userid": 1, "url": "", "clickDate": ISODate("20120202T12:01:00Z") } 
{ "_id": ObjectId("508ab0e27bb16229520c9563"), "userid": 2, "url": "", "clickDate": ISODate("20120303T12:01:00Z") } 
{ "_id": ObjectId("508ab0e27bb16229520c9564"), "userid": 3, "url": "", "clickDate": ISODate("20120404T11:01:00Z") } 
{ "_id": ObjectId("508ab0e27bb16229520c9565"), "userid": 4, "url": "", "clickDate": ISODate("20120505T11:01:00Z") } 

這裏是聚合函數:

db.test.aggregate({ 
         $match: { 
         clickDate: { $gte: new Date(2012,8,30,12,0,0) } 
         } 
        }, 
        { 
         $group: { 
         _id: "$userid", 
         clicks: { $sum: 1 } 
         } 
        } 
       ); 

確保您的$group之前有$match 。請參閱early filtering

結果:

{ 
    "result": [ 
    { "_id": 8, 
     "clicks": 1 
    }, 
    { "_id": 7, 
     "clicks": 2 
    }, 
    { "_id": 6, 
     "clicks": 2 
    }, 
    { "_id": 3, 
     "clicks": 2 
    }, 
    { "_id": 2, 
     "clicks": 2 
    }, 
    { "_id": 1, 
     "clicks": 2 
    }, 
    { "_id": 4, 
     "clicks": 2 
    }, 
    { "_id": 0, 
     "clicks": 2 
    }, 
    { "_id": 5, 
     "clicks": 2 
    }, 
    { "_id": 9, 
     "clicks": 1 
    } 
    ], 
    "ok": 1 
} 

的數據與此迴路中產生:

// d=days, m=months (for ISODate months start from 0, while days from 1) 
for (var i = 0, d = 1, m = 0, id = 0; i < 100; i++, d++, m++, id++) { 
    if (d > 30){ 
    d=1; 
    } 
    if (m > 10){ 
    m=0; 
    } 
    if (id > 9){ 
    id=0; 
    } 
    db.test.insert({userid: id, url:"", clickDate: new Date(2012,m,d,12,1,0)}); 
} 
+0

不幸的是,在註釋中描述,他的日期,實際上是一個數組,所以他希望自己的文檔中的數組中匹配的日期,然後$放鬆的(最有可能),然後算量匹配,然後$組由用戶ID。基本上只給$加上日期數組的匹配日期。 – Sammaye