Tenemos un sitio que contiene transmisión de video y queremos mostrar tres informes de los videos más vistos en la última semana, mes y año (una ventana emergente).Ravendb mapreduce agrupar por campos múltiples
Almacenamos un documento en ravendb cada vez que se observó un video:
public class ViewedContent
{
public string Id { get; set; }
public int ProductId { get; set; }
public DateTime DateViewed { get; set; }
}
Estamos teniendo problemas para encontrar la manera de definir los índices/mapreduces que mejor soporte de la generación de esos tres informes.
Hemos intentado el siguiente mapa/reducir.
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)
};
}
}
embargo, esta consulta devuelve un error:
var lastSevenDays = session.Query<ViewedContent, ViewedContentIndex>()
.Where(x => x.DateViewed > DateTime.UtcNow.Date.AddDays(-7));
Error: "DateViewed is not indexed"
En última instancia, que desea 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)
Esta realidad no compilar, debido a que la OrderBy está mal; Count no es una propiedad válida aquí.
Cualquier ayuda aquí sería apreciada.
Sí, eso fue todo! El cambio mental fue ver que podía agrupar un objeto y no solo un campo. En última instancia, tenemos que consultar en una ventana de fechas. Pero, esto me da exactamente lo que necesito. ¡Gracias de nuevo! –