Ravendb mapreduce按多个字段分组

我们有一个包含流媒体video的网站,我们希望在上周,月份和年份(滚动窗口)显示三个最受关注video的报告。

每次观看video时,我们都会在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 { 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() .Where( x => x.DateViewed > DateTime.UtcNow.Date.AddDays(-7) ); 

错误:“DateViewed未编入索引”

最终,我们想要查询类似于:

 var lastSevenDays = session.Query() .Where( x => x.DateViewed > DateTime.UtcNow.Date.AddDays(-7) ) .GroupBy( x => x.ProductId ) .OrderBy( x => x.Count ) 

这实际上并没有编译,因为OrderBy是错误的; Count在这里不是有效的财产。

任何帮助在这里将不胜感激。

如果您在SQL土地上,每个报告都是不同的GROUP BY,它告诉您需要三个索引 – 一个只有月份,一个按周,一个月,一个一年(或者可能略有不同,具体取决于索引)关于你如何实际进行查询。

现在,你有一个DateTime – 这会出现一些问题 – 你真正想要做的是索引DateTime的Year组件,日期时间的Month组件和该日期时间的Day组件。 (或者只是其中一个或两个,具体取决于您要生成哪个报告。

我只是在这里引用你的代码,所以很明显它不会编译,但是:

 public class ViewedContentIndex : AbstractIndexCreationTask { 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这样做,而我还没有在这台计算机上使用它,所以无法validation这一点,但理论仍然是相同的。

所以,要重新迭代

您希望按周+产品ID为报表编制索引您希望按月添加报表索引+产品ID您希望按年度+产品ID为报表编制索引

我希望这有帮助,对不起我不能给你一个可编辑的例子,缺乏乌鸦使它有点困难:-)