我们有一个包含流媒体视频的网站,我们希望在上周,月份和年份(滚动窗口)中显示三个观看次数最多的视频报告。
每次观看视频时,我们都会在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) );
错误:“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在这里不是有效的财产。
任何帮助都将不胜感激。
答案 0 :(得分:10)
如果您在SQL土地上,每个报告都是不同的GROUP BY,它告诉您需要三个索引 - 一个只有月份,一个按周,一个月,一个一年(或者可能)根据您实际进行查询的方式略有不同。
现在,你有一个DateTime - 这会出现一些问题 - 你实际想要做的是索引DateTime的Year组件,日期时间的Month组件和Day组件约会时间。 (或者只根据您要生成的报告中的一个或两个。
我只是在这里引用你的代码,所以很明显它不会编译,但是:
public class ViewedContentIndex :
AbstractIndexCreationTask<ViewedContent, ViewedContentResult>
{
public ViewedContentIndex()
{
Map = docs => from doc in docs
select new
{
doc.ProductId,
Day = doc.DateViewed.Day,
Month = doc.DateViewed.Month,
Year = doc.DateViewed.Year
Count = 1
};
Reduce = results => from result in results
group result by new {
doc.ProductId,
doc.DateViewed.Day,
doc.DateViewed.Month,
doc.DateViewed.Year
}
into agg
select new
{
ProductId = agg.Key.ProductId,
Day = agg.Key.Day,
Month = agg.Key.Month,
Year = agg.Key.Year
Count = agg.Sum(x => x.Count)
};
}
}
希望你能看到我想要实现的目标 - 你想要组中的所有组件,因为它们是你的分组的独特之处。
我不记得RavenDB是否允许你用DateTimes做这个,而我没有在这台计算机上得到它,所以无法验证这一点,但理论仍然是相同的。
所以,重新迭代
您希望按周+产品ID为报表编制索引 您希望按月和产品ID为报表编制索引 您希望按年份+产品ID
为报表编制索引我希望这会有所帮助,对不起我不能给你一个可编辑的例子,缺乏乌鸦使它有点困难: - )