【发布时间】:2011-03-24 05:48:14
【问题描述】:
我们有一个包含流媒体视频的网站,我们希望显示上周、月和年(滚动窗口)中观看次数最多的视频的三份报告。
每次观看视频时,我们都会在 ravendb 中存储一个文档:
public class ViewedContent
{
public string Id { get; set; }
public int ProductId { get; set; }
public DateTime DateViewed { get; set; }
}
我们无法确定如何定义最能支持生成这三个报告的索引/mapreduce。
我们尝试了下面的map/reduce。
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 属性无效。
如有任何帮助,我们将不胜感激。
【问题讨论】: