我們有一個包含流式視頻的網站,我們希望在上週,月和年(滾動窗口)中顯示三個最受關注視頻的報告。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