按小时分组$ group(聚合)

时间:2018-04-27 15:47:42

标签: mongodb aggregation-framework

我在mongo集合中有这个数据时间:

{   
 ...
 "CreationDateTime" : ISODate("2017-03-06T08:16:02.930Z"),
 ...
},
....
{   
 ...
 "CreationDateTime" : ISODate("2018-03-06T08:16:04.030Z"),
 ...
},...

我想按小时对我的收藏品进行分组。意思是我想那些文件在8点钟来到同一组并且那些文件在9点钟来到同一组。因为我想在同一组中选择第一个文档。有人用它的累加器运算符对这个分组有任何逻辑或想法吗?

3 个答案:

答案 0 :(得分:1)

如果您只想要特定小时,那么您可以在聚合框架中使用$hour,如下所示:

db.col.aggregate([
    {
        $group: {
            _id: { $hour: "$CreationDateTime" },
            docs: { $push: "$$ROOT" }
        }
    }
])

MongoDB会将8设置为您的文档的分组_id。否则,如果您需要一个小时作为间隔,则必须使用$dayOfMonth$month$years,如下所示

db.col.aggregate([
    {
        $group: {
            _id: {
                h: { $hour: "$CreationDateTime" },
                d: { $dayOfMonth: "$CreationDateTime" } ,
                m: { $month: "$CreationDateTime" } ,
                y: { $year: "$CreationDateTime" } ,
            },
            docs: { $push: "$$ROOT" },
            firstDoc: { $first: "$$ROOT" }
        }
    }
])

在这种情况下,您将{ "h" : 8, "d" : 6, "m" : 3, "y" : 2017 }作为分组_id

答案 1 :(得分:0)

  

你可以像mapReduce实用程序那样

db.collection.mapReduce(function(){

  var hour = this.CreationDateTime.getHour()
  emit(this.hour,this)
},function(key,values){
 return JSON.stringify(values);
},{out:{inline:true}});

答案 2 :(得分:0)

  

这是汇总框架解决方案

db.collection.aggregate(
       [
         {
           $group:
             {
               _id: "$CreationDateTime",
               items: { $push:  { field1: "$field1", field2: "$field1" } }
             }
         }
       ]
    )