ストリーミング ビデオを含むサイトがあり、過去 1 週間、1 か月、1 年間 (ローリング ウィンドウ) で最も視聴されたビデオの 3 つのレポートを表示したいと考えています。
ビデオが視聴されるたびにドキュメントを ravendb に保存します。
public class ViewedContent
{
public string Id { get; set; }
public int ProductId { get; set; }
public DateTime DateViewed { get; set; }
}
これら 3 つのレポートの生成を最適にサポートするインデックス / mapreduces を定義する方法がわかりません。
次のマップ/リデュースを試しました。
public class ViewedContentResult
{
public int ProductId { get; set; }
public DateTime DateViewed { get; set; }
public int Count { get; set; }
}
public class ViewedContentIndex :
AbstractIndexCreationTask<ViewedContent, ViewedContentResult>
{
public ViewedContentIndex()
{
Map = docs => from doc in docs
select new
{
doc.ProductId,
DateViewed = doc.DateViewed.Date,
Count = 1
};
Reduce = results => from result in results
group result by result.DateViewed
into agg
select new
{
ProductId = agg.Key,
Count = agg.Sum(x => x.Count)
};
}
}
ただし、このクエリはエラーをスローします。
var lastSevenDays = session.Query<ViewedContent, ViewedContentIndex>()
.Where( x => x.DateViewed > DateTime.UtcNow.Date.AddDays(-7) );
エラー: 「DateViewed はインデックス化されていません」
最終的に、次のようなクエリを実行します。
var lastSevenDays = session.Query<ViewedContent, ViewedContentIndex>()
.Where( x => x.DateViewed > DateTime.UtcNow.Date.AddDays(-7) )
.GroupBy( x => x.ProductId )
.OrderBy( x => x.Count )
OrderBy が間違っているため、これは実際にはコンパイルされません。ここでは Count は有効なプロパティではありません。
ここで何か助けていただければ幸いです。