Mapreduce 用RavenDB指数按小时计数

Mapreduce 用RavenDB指数按小时计数,mapreduce,ravendb,Mapreduce,Ravendb,我正在使用RavenDB存储事件集合。这些事件有一个日期,我用它来按天分组(DateTime.date)。我试图按小时添加一些统计数据,但我似乎找不到一个干净的方法 简单的方法是: public class DailyStats : AbstractIndexCreationTask<Incident, DateStat> { public DailyStats() { Map = docs => from doc in docs

我正在使用RavenDB存储事件集合。这些事件有一个日期,我用它来按天分组(DateTime.date)。我试图按小时添加一些统计数据,但我似乎找不到一个干净的方法

简单的方法是:

public class DailyStats : AbstractIndexCreationTask<Incident, DateStat>
{
    public DailyStats()
    {
        Map = docs => from doc in docs
                      select new 
                                 {
                                     doc.OccuredOn,
                                     Hour0 = doc.OccuredOn.Hour == 0 ? 1 : 0
                                     Hour1 = doc.OccuredOn.Hour == 1 ? 1 : 0
                                     //....
                                 };

        Reduce = mapped => from m in mapped
                           group m by new { m.Date.Date }
                           into g
                           select new
                                      {
                                          g.Key.Date,
                                          Hour0 = g.Sum(x => x.Hour0),
                                          Hour1 = g.Sum(x => x.Hour1)
                                          //....
                                      }
    }
}
公共类DailyStats:AbstractIndexCreationTask
{
公共日报()
{
Map=docs=>来自文档中的文档
选择新的
{
唐博士,
小时0=doc.occurrendon.Hour==0?1:0
小时1=doc.occurrendon.Hour==1?1:0
//....
};
Reduce=mapped=>从映射中的m开始
按新{m.Date.Date}分组的m
进入g
选择新的
{
g、 关键日期,
小时0=g.Sum(x=>x.Hour0),
小时1=g.Sum(x=>x.Hour1)
//....
}
}
}
但这是可怕的重复。相反,我尝试使用字典:

public class DailyStats : AbstractIndexCreationTask<Incident, DateStat>
{
    public DailyStats()
    {
        Map = docs => from doc in docs
                      select new 
                                 {
                                     doc.OccuredOn,
                                     IncidentsByHour = Enumerable.Range(0, 24).ToDictionary(h => h, h => doc.IncidentDate.Hour == h ? 1 : 0),
                                 };

        Reduce = mapped => from m in mapped
                           group m by new { m.Date.Date }
                           into g
                           select new
                                      {
                                          g.Key.Date,
                                          IncidentsByHour = Enumerable.Range(0, 24).Select(h => g.Sum(x => x.IncidentsByHour[h])),
                                      }
    }
}
公共类DailyStats:AbstractIndexCreationTask
{
公共日报()
{
Map=docs=>来自文档中的文档
选择新的
{
唐博士,
IncidentsByHour=Enumerable.Range(0,24).ToDictionary(h=>h,h=>doc.IncidentDate.Hour==h?1:0),
};
Reduce=mapped=>从映射中的m开始
按新{m.Date.Date}分组的m
进入g
选择新的
{
g、 关键日期,
IncidentsByHour=Enumerable.Range(0,24)。选择(h=>g.Sum(x=>x.IncidentsByHour[h]),
}
}
}
这会引发异常:

第201行,位置22:错误CS1502-与“System.Linq.Enumerable.ToDictionary(System.Collections.Generic.IEnumerable,System.Func,System.Collections.Generic.IEqualityComparer)”匹配的最佳重载方法具有一些无效参数 第201行,位置72:错误CS1503-参数2:无法从“System.Func”转换为“System.Func” 第201行,位置106:错误CS1503-参数3:无法从“System.Func”转换为“System.Collections.Generic.IEqualityComparer” 第274行,位置22:错误CS1928-“System.Collections.Generic.IEnumerable”不包含“Select”和最佳扩展方法重载的定义“System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable,System.Func)”具有一些无效参数 第274行,位置54:错误CS1503-参数2:无法从“System.Func”转换为“System.Func”

我不知道如何解决这个异常,因为它发生在Raven方面

按天分组的原因是我需要获取365天的统计数据,但仍然有一些按小时分组的基本信息。是否最好改为使用两个索引,一个按天一个按小时(总共加载365+24条记录。我的理解是,索引越大越好,但索引越少越好)?

尝试以下方法:

public class DailyStats : AbstractIndexCreationTask<Incident, DateStat>
{
  public DailyStats()
  {
    Map = docs =>
      from doc in docs
      select new
      {
        Date = doc.OccuredOn,
        IncidentsByHour = new Dictionary<int, int> { { doc.OccuredOn.Hour, 1 } }
      };

    Reduce = mapped =>
      from m in mapped
      group m by new { m.Date.Date }
      into g
      select new
      {
        Date = g.Key,
        IncidentsByHour = g.SelectMany(x => x.IncidentsByHour)
                           .GroupBy(x => x.Key)
                           .OrderBy(x => x.Key)
                           .ToDictionary(x => x.Key, x => x.Sum(y => y.Value))
      };
  }
}
但由于某种奇怪的原因,它失败了。我会把它当作bug报告


是的,大索引通常比小索引少。

根据您想要的结果,您可以尝试分面搜索。

显然,只有当你已经深入到你感兴趣的那一天时,这才有效。我还将编写代码来生成范围,但它看起来如下所示:

var myCoolStuff = session.Query<Incident, SomeIndex>().Where().ToFacet(
new List<Facet>
          {
              new Facet
                  {
                      Name = "OccuredOn"
                      Mode = FacetMode.Ranges,
                      Ranges =
                          {
                              "[2013-01-01T00:00 TO 2013-01-01T01:00]",
                              "[2013-01-01T01:00 TO 2013-01-01T02:00]",
                              "[2013-01-01T02:00 TO 2013-01-01T03:00]",
                              "[2013-01-01T03:00 TO 2013-01-01T04:00]",
                              "[2013-01-01T04:00 TO 2013-01-01T05:00]",
                              "[2013-01-01T05:00 TO 2013-01-01T06:00]",
                              "[2013-01-01T06:00 TO 2013-01-01T07:00]",
                              "[2013-01-01T07:00 TO 2013-01-01T08:00]",
                              "[2013-01-01T08:00 TO 2013-01-01T09:00]",
                              "[2013-01-01T09:00 TO 2013-01-01T10:00]",
                              "[2013-01-01T10:00 TO 2013-01-01T11:00]",
                              "[2013-01-01T11:00 TO 2013-01-01T12:00]",
                              "[2013-01-01T12:00 TO 2013-01-01T13:00]",
                              "[2013-01-01T13:00 TO 2013-01-01T14:00]",
                              "[2013-01-01T14:00 TO 2013-01-01T15:00]",
                              "[2013-01-01T15:00 TO 2013-01-01T16:00]",
                              "[2013-01-01T16:00 TO 2013-01-01T17:00]",
                              "[2013-01-01T17:00 TO 2013-01-01T18:00]",
                              "[2013-01-01T18:00 TO 2013-01-01T19:00]",
                              "[2013-01-01T19:00 TO 2013-01-01T20:00]",
                              "[2013-01-01T20:00 TO 2013-01-01T21:00]",
                              "[2013-01-01T21:00 TO 2013-01-01T22:00]",
                              "[2013-01-01T22:00 TO 2013-01-01T23:00]",
                              "[2013-01-01T23:00 TO 2013-01-02T00:00]"
                          }                      
});
var mycolstuff=session.Query().Where().ToFacet(
新名单
{
新方面
{
Name=“don”
Mode=FacetMode.Ranges,
范围=
{
“[2013-01-01T00:00至2013-01-01T01:00]”,
“[2013-01-01T01:00至2013-01-01T02:00]”,
“[2013-01-01T02:00至2013-01-01T03:00]”,
“[2013-01-01T03:00至2013-01-01T04:00]”,
“[2013-01-01T04:00至2013-01-01T05:00]”,
“[2013-01-01T05:00至2013-01-01T06:00]”,
“[2013-01-01T06:00至2013-01-01T07:00]”,
“[2013-01-01T07:00至2013-01-01T08:00]”,
“[2013-01-01T08:00至2013-01-01T09:00]”,
“[2013-01-01T09:00至2013-01-01T10:00]”,
“[2013-01-01T10:00至2013-01-01T11:00]”,
“[2013-01-01T11:00至2013-01-01T12:00]”,
“[2013-01-01T12:00至2013-01-01T13:00]”,
“[2013-01-01T13:00至2013-01-01T14:00]”,
“[2013-01-01T14:00至2013-01-01T15:00]”,
“[2013-01-01T15:00至2013-01-01T16:00]”,
“[2013-01-01T16:00至2013-01-01T17:00]”,
“[2013-01-01T17:00至2013-01-01T18:00]”,
“[2013-01-01T18:00至2013-01-01T19:00]”,
“[2013-01-01T19:00至2013-01-01T20:00]”,
“[2013-01-01T20:00至2013-01-01T21:00]”,
“[2013-01-01T21:00至2013-01-01T22:00]”,
“[2013-01-01T22:00至2013-01-01T23:00]”,
“[2013-01-01T23:00至2013年-
var myCoolStuff = session.Query<Incident, SomeIndex>().Where().ToFacet(
new List<Facet>
          {
              new Facet
                  {
                      Name = "OccuredOn"
                      Mode = FacetMode.Ranges,
                      Ranges =
                          {
                              "[2013-01-01T00:00 TO 2013-01-01T01:00]",
                              "[2013-01-01T01:00 TO 2013-01-01T02:00]",
                              "[2013-01-01T02:00 TO 2013-01-01T03:00]",
                              "[2013-01-01T03:00 TO 2013-01-01T04:00]",
                              "[2013-01-01T04:00 TO 2013-01-01T05:00]",
                              "[2013-01-01T05:00 TO 2013-01-01T06:00]",
                              "[2013-01-01T06:00 TO 2013-01-01T07:00]",
                              "[2013-01-01T07:00 TO 2013-01-01T08:00]",
                              "[2013-01-01T08:00 TO 2013-01-01T09:00]",
                              "[2013-01-01T09:00 TO 2013-01-01T10:00]",
                              "[2013-01-01T10:00 TO 2013-01-01T11:00]",
                              "[2013-01-01T11:00 TO 2013-01-01T12:00]",
                              "[2013-01-01T12:00 TO 2013-01-01T13:00]",
                              "[2013-01-01T13:00 TO 2013-01-01T14:00]",
                              "[2013-01-01T14:00 TO 2013-01-01T15:00]",
                              "[2013-01-01T15:00 TO 2013-01-01T16:00]",
                              "[2013-01-01T16:00 TO 2013-01-01T17:00]",
                              "[2013-01-01T17:00 TO 2013-01-01T18:00]",
                              "[2013-01-01T18:00 TO 2013-01-01T19:00]",
                              "[2013-01-01T19:00 TO 2013-01-01T20:00]",
                              "[2013-01-01T20:00 TO 2013-01-01T21:00]",
                              "[2013-01-01T21:00 TO 2013-01-01T22:00]",
                              "[2013-01-01T22:00 TO 2013-01-01T23:00]",
                              "[2013-01-01T23:00 TO 2013-01-02T00:00]"
                          }                      
});