2013-07-02 64 views
2

我对当前正在运行的项目有一个mongo问题,需要您的帮助。按mongodb集合中的日期分组

下面是我的问题:

我有我的存储用户的日志数据作为样本:

db.visitors收集

[ 
    { 
     uid: "0001", 
     logPath: "/home", 
     logTime: "Mon Dec 27 2010 18:51:22 GMT+0000 (UTC)" 
    }, 
    { 
     uid: "0002", 
     logPath: "/", 
     logTime: "Mon Dec 27 2010 18:51:22 GMT+0000 (UTC)" 
    }, 
    { 
     uid: "0001", 
     logPath: "/product", 
     logTime: "Mon Dec 27 2010 18:51:23 GMT+0000 (UTC)" 
    }, 
    { 
     uid: "0001", 
     logPath: "/order", 
     logTime: "Mon Dec 28 2010 18:51:23 GMT+0000 (UTC)" 
    } 
] 

,我需要我的群访用户通过日期(在2010年12月28日星期一至2010年12月27日星期一之间)

尝试查找具有uid的用户的日志为0001和组:

[ 
    { 
     date: "Mon Dec 28", 
     log: [ 
      { 
       logPath: '/order' 
      } 
     ] 
    }, 
    { 
     date: "Mon Dec 27", 
     log: [ 
      { 
       logPath: '/home' 
      }, 
      { 
       logPath: '/product' 
      } 
     ] 
    } 
] 

请指导我怎么做我这组

+0

日期真的是字符串吗? – Sammaye

+0

Date对象中的所有日期 –

回答

1
db.aggregate([ 
    {$match: {uid: "0001", logTime: {$gte: ISODate('Mon Dec 27 2010'), $lt: ISODate("Mon Dec 29 2010")}}}, 
    {$project: 
     {day: {'$dayOfMonth': '$logTime'},month: {'$month':'$logTime'},year: {'$year':'$logTime'} } 
    }, 
    {$group: { 
     _id: {day:'$day',month:'$month',year:'$year'}, 
     log: {$push:{logPath:'$logPath'}} 
    }} 
]) 

类似的东西应该做的伎俩。如果您想仅按月分组,则可以从$group_id中取出day字段。

还有另一种做日期的方式,但我必须承认这种方式可能是目前最简单的方法。

+0

如果你想 - 你可以省略'{$ project:..}'步骤,因为'{$ dayOfMonth:...}'操作符等在'{$ group: ...}'。 –

+0

@康拉德迪恩确实,虽然我(个人)认为看起来很难阅读 – Sammaye

+0

完全公平。嘿 - 你知道是否有可能在'{$ match:..}'中使用它们吗?我一直想避免使用ISODate()进行过滤# –