2013-05-31 69 views
0

我有簡單的MongoDB集合:如何構建與聚合框架日期MongoDB中

> db.installer.find().pretty() 
{ 
"_id" : ObjectId("51a875c83146de1db23d25d4"), 
"dt" : ISODate("2013-05-31T10:04:56.567Z"), 
"ev" : "screenDisplay_welcome" 
} 
{ 
"_id" : ObjectId("51a875c83146de1db23d25d5"), 
"dt" : ISODate("2013-05-31T10:04:56.568Z"), 
"ev" : "distribution" 
} 
... 
{ 
"_id" : ObjectId("51a87a4d3146de1e6a8de9e2"), 
"dt" : ISODate("2013-05-31T10:24:13.901Z"), 
"ev" : "screenDisplay_welcome" 
} 

'EV' - 一些事件。 「DT」 - 這一事件

我想獲得有關此事件的事件名稱和事件當天分組統計數據的日期時間:

> db.installer.aggregate([{$group:{_id:{ev:'$ev', dt:{$dayOfYear:'$dt'}}, sum:{$sum:1}}}, {$project:{sum:1, _id:0, name:'$_id.ev', dt:'$_id.dt'}}]) 
{ 
"result" : [ 
    { 
     "sum" : 8, 
     "name" : "uninstall", 
     "dt" : 151 
    }, 
    { 
     "sum" : 3, 
     "name" : "screenDisplay_installServices", 
     "dt" : 151 
    }, 
    { 
     "sum" : 558, 
     "name" : "distribution", 
     "dt" : 151 
    }, 
    { 
     "sum" : 115, 
     "name" : "screenDisplay_welcome", 
     "dt" : 151 
    } 
], 
"ok" : 1 
} 

在這裏,我的用戶$ DAYOFYEAR命令刪除時間安排所有活動。 有什麼辦法可以構建我的日期對象返回聚合管道內?

例如「DT」:151「DT」:ISODate( 「2013-05-31T00:00:00.000Z」)

+0

不,不與聚合框架,你不能在一個聚合對象表達構建一個Date對象(至少在2.2): - /請問日期字符串而不是一個日期是一個選項,或者可能使用MapReduce? –

+0

不要使用$ dayOfYear(如果你有超過一年的數據,它不會正常工作),你可以使用我在這裏描述的技巧:http://www.kamsky.org/1/post/ 2013/03/stupid-date-trick-with-aggregation-framework.html - 基本上就是從$ group階段之前的日期開始放下小時,分鐘,秒和毫秒。 –

+0

@AsyaKamsky感謝您的鏈接。這就是我一直在尋找的! –

回答

2

雖然目前無法構建一個日期在聚合管道,你可以只需取第一個日期時間(稍後在客戶端處理它)。

例如:

db.installer.aggregate([  
    {$group:  
    {   
    _id:{ev:'$ev', doy:{$dayOfYear:'$dt'} }, 
    sum:{$sum:1}, 
    date:{$first: '$dt'} 
    }, 
    }, 
    {$project:{sum:1, _id:0, name:'$_id.ev', dt:'$_id.doy', date:1}} 
]) 
1

只是作爲替代@ jimoleary的解決方案,如果你無論如何處理在客戶端上,爲什麼混淆日開始說起? :)

db.installer.aggregate([ 
{ 
    $group: 
    { 
    _id: { ev: '$ev', doy: { $substr: ['$dt', 0, 10] } }, 
    sum: { $sum: 1 } 
    } 
}, 
{ 
    $project: 
    { 
    sum: 1, _id: 0, name: '$_id.ev', dt: '$_id.doy' 
    } 
} 
]) 
+1

不錯!我喜歡你的解決方案。 – jimoleary