Ravendb mapreduce agrupamento por vários campos
Temos um site que contém streaming de vídeo e queremos exibir três relatórios dos vídeos mais assistidos na última semana, mês e ano (uma janela rolante
Armazenamos um documento no ravendb sempre que um vídeo é assistido:
public class ViewedContent
{
public string Id { get; set; }
public int ProductId { get; set; }
public DateTime DateViewed { get; set; }
}
Estamos com problemas para descobrir como definir os índices / índices que melhor suportariam a geração desses três relatório
Tentamos o seguinte mapa / redução.
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)
};
}
}
Mas, esta consulta gera um erro:
var lastSevenDays = session.Query<ViewedContent, ViewedContentIndex>()
.Where( x => x.DateViewed > DateTime.UtcNow.Date.AddDays(-7) );
Erro: "DateViewed não está indexado"
Finalmente, queremos consultar algo como:
var lastSevenDays = session.Query<ViewedContent, ViewedContentIndex>()
.Where( x => x.DateViewed > DateTime.UtcNow.Date.AddDays(-7) )
.GroupBy( x => x.ProductId )
.OrderBy( x => x.Count )
Isso realmente não compila, porque o OrderBy está errado; Count não é uma propriedade válida aqui.
Qualquer ajuda aqui seria apreciada