我们有一个包含流式视频的网站,我们希望在上周,月和年(滚动窗口)中显示三个最受关注视频的报告。Ravendb mapreduce按多个字段分组
我们存储在ravendb观看视频的每一次文件:
public class ViewedContent
{
public string Id { get; set; }
public int ProductId { get; set; }
public DateTime DateViewed { get; set; }
}
我们遇到了麻烦搞清楚如何定义索引/ mapreduces能最好地支持生成这三个报告。
我们尝试了下面的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));
Error: "DateViewed is not indexed"
最终,我们要查询类似:
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在这里不是一个有效的属性。
任何帮助在这里将不胜感激。
是的,这是它!这里的心理转变是看到我可以将一个物体而不仅仅是一个物体组合在一起。最终,我们必须查询日期的滚动窗口。但是,这正是我所需要的。再次感谢! – 2011-03-23 23:36:13