MongoDb aggregation Group by Date

前端 未结 3 2010
离开以前
离开以前 2021-02-08 00:57

I\'m trying to group by timestamp for the collection named \"foo\" { _id, TimeStamp }

db.foos.aggregate(
[
   {$group : { _id : new Date (Date.UTC({ $year : \'$T         


        
3条回答
  •  清歌不尽
    2021-02-08 01:40

    It depends on whether you want to have the date as ISODate type in the final output. If so, then you can do one of two things:

    1. Extract $year, $month, $dayOfMonth from your timestamp and then reconstruct a new date out of them (you are already trying to do that, but you're using syntax that doesn't work in aggregation framework).

    2. If the original Timestamp is of type ISODate() then you can do date arithmetic to subtract the hours, minutes, seconds and milliseconds from your timestamp to get a new date that's "rounded" to the day.

    There is an example of 2 here.

    Here is how you would do 1. I'm making an assumption that all your dates are this year, but you can easily adjust the math to accommodate your oldest date.

    project1={$project:{_id:0, 
                       y:{$subtract:[{$year:"$TimeStamp"}, 2013]},
                       d:{$subtract:[{$dayOfYear:"$TimeStamp"},1]}, 
                       TimeStamp:1, 
                       jan1:{$literal:new ISODate("2013-01-01T00:00:00")}
             } };
    project2={$project:{tsDate:{$add:[
                           "$jan1",
                           {$multiply:["$y", 365*24*60*60*1000]},
                           {$multiply:["$d", 24*60*60*1000]}
             ] } } };
    

    Sample data:

    db.foos.find({},{_id:0,TimeStamp:1})
    { "TimeStamp" : ISODate("2013-11-13T19:15:05.600Z") }
    { "TimeStamp" : ISODate("2014-02-01T10:00:00Z") }
    

    Aggregation result:

    > db.foos.aggregate(project1, project2)
    { "tsDate" : ISODate("2013-11-13T00:00:00Z") }
    { "tsDate" : ISODate("2014-02-01T00:00:00Z") }
    

提交回复
热议问题