3

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)
                                          //....
                                      }
    }
}

しかし、これは恐ろしく繰り返されます。代わりに、辞書を使用しようとしています。

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])),
                                      }
    }
}

これは例外をスローします:

行 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 日分の統計を取得する必要があるためですが、時間ごとの基本的な情報もいくつかあります。代わりに、1 日ごとと 1 時間ごとの 2 つのインデックスを用意したほうがよいでしょうか (合計 365 + 24 レコードが読み込まれます。私の理解では、インデックスは大きくてもインデックスは少ない方が最適です)。

4

2 に答える 2

1

結果をどのように表示したいかによっては、ファセット検索を試すことができます。 http://ravendb.net/docs/2.5/client-api/faceted-search

明らかに、これは、関心のある日にすでにドリルダウンしている場合にのみ機能します。範囲を生成するコードも記述しますが、次のようになります。

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]"
                          }                      
});
于 2013-11-06T22:36:56.120 に答える