当前位置: 首页 > 知识库问答 >
问题:

按时间间隔分组Spring-数据-蒙哥

梁丘扬
2023-03-14
{
   "_id":"5c59c35d8610f702d00e6f70",
   "stationId":"2",
   "listenerId":"807",
   "streamId":"37",
   "userAgentId":"7",
   "botDefinitionId":"18",
   "ipAddress":"50.116.14.48",
   "startTime":"2018-02-06T12:51:59.000Z",
   "endTime":"2018-02-06T12:53:56.000Z",
   "listenLength":"117",
   "totalDataUsed":"1433582",
}
{
   '_id':{
      'year':{
         '$year':'$startTime'
      },
      'week':{
         '$week':'$startTime'
      },
      'dayOfMonth':{
         '$dayOfMonth':'$startTime'
      },
      'month':{
         '$month':'$startTime'
      },
      'hour':{
         '$hour':'$startTime'
      },
      'interval':{
         '$subtract':[
            {
               '$minute':'$startTime'
            },
            {
               '$mod':[
                  {
                     '$minute':'$startTime'
                  },
                  15
               ]
            }
         ]
      }
   },
   'count':{
      '$sum':1
   }
}

然后返回给我以下文档:

_id:{
   year:2018   week:15   dayOfMonth:18   month:4   hour:18   interval:45
},
count:9

如何使用GroupOperation在spring-data-mongo中指定form这个聚合?

共有1个答案

章涵容
2023-03-14

我能想到的一种方法是在$project阶段调用函数,而不是在$group阶段调用它们。

使用DateOperator类提取像小时、分钟、年等字段。然后将SpEL和Expression用于interval字段,如下所示:

andExpression("minute - minute % 15").as("interval")

这将用小时、间隔、年等字段重塑文档,然后将它们分组在间隔和其他您需要的字段上。

Aggregation agg = Aggregation.newAggregation(

    Aggregation.project()
        .and(DateOperators.Minute.minute("$timestamp")).as("minute")
        .and(DateOperators.Hour.hour("$timestamp")).as("hour")
        .and(DateOperators.DayOfMonth.dayOfMonth("$timestamp")).as("dayOfMonth"),

    Aggregation.project("hour","dayOfMonth","minute")
        .andExpression("minute - minute % 15").as("interval"),

    Aggregation.group("hour","dayOfMonth","interval")
        .addToSet("hour").as("hour")
        .addToSet("dayOfMonth").as("dayOfMonth")
        .addToSet("interval").as("interval")
        .count().as("count")
);

List<QueryResult> result = mongoTemplate.aggregate(agg, "collection_name", QueryResult.class).getMappedResults();
 类似资料:
  • 问题内容: 我需要将表分组为15分钟间隔。我可以这样做: 但是要在图表中显示返回的数据,我还需要插入没有任何数据且当前未出现在我的select语句中的间隔。我该如何插入这些? 问题答案: 用15分钟的增量创建一个带有所有可能时间戳的表,然后从该表向上面的查询进行LEFT JOIN。 如果您知道图表始终涵盖24小时,则只需创建一个数字为0-95的表格,然后为每个条目将其添加到图表的开始时间。

  • 问题内容: 我有一个数据集: 我想基本上在一个小时内“拆分”这些时间间隔,例如: 到目前为止,这是我的代码(该想法的积分发给@DumitrescuBogdan,将通话数据分为15分钟间隔): 后半部分(在“全部合并”之后)不产生任何结果,前半部分产生以下结果: 谢谢,我是初学者。我了解第一部分;坦白地说,我不明白下半场 我愿意接受其他解决方案。 我正在使用MS-Access 2010 问题答案:

  • 问题内容: 我有一个这样的dataFrame,我想每60分钟进行一次分组,然后从06:30开始分组。 我在用: 我得到这个分组: 但我正在寻找这个结果: 我如何告诉该功能以6小时30分开始以一小时为间隔进行分组? 如果 .groupby(pd.TimeGrouper(freq =‘60Min’)) 无法完成此 操作 ,最好的方法是怎么做? 致敬并非常感谢 问题答案: 使用会同中的参数。 指定将使时

  • 我得到的数据集如下所示: 我想按时间字段对其进行分组,并获取每个时间间隔的MAX(openBid),并拥有最后5个间隔(在本例中为5分钟)。我使用这个查询: 结果如下: 我遇到的问题是,随着时间的推移,结果集中第一条记录的计数从1增加到5。在这个例子中,它是3。我希望我的查询在所有时间间隔内都有相同数量的记录。我认为问题是GROUP BY准时从集合的第一条记录开始。由于我正在执行ORDER BY

  • 问题内容: 我有一个包含datetime列和一些其他列的表。datetime列表示发生的事件。它可以包含一个时间(事件在那个时间发生)或NULL(事件没有发生) 我现在想计算在特定时间间隔(15分钟)内发生的记录数,但是不知道该怎么做。 例子: 现在,我想创建一个查询,该查询将创建类似于以下内容的结果集: 这在SQL中可能吗,或者有人可以建议我可以使用哪些其他工具?(例如,将数据导出到电子表格程序

  • 问题内容: 我正在尝试生成时间间隔数组。例如: 它应该在祖鲁时间直到每天晚上9点创建上述元素。 也应该为下一个和后一天生成元素 起始时间从7:00 am-Ed time 9:00 pm,如果current_time> start_time,则生成15分钟的时间间隔数组,直到9 pm。然后为第二天和第二天生成2。间隔应该是这样的7:00、7:15 ..不在7:12、8:32 问题答案: 这是供您使用