Каждый отчет - это отдельная GROUP BY, если вы находитесь в среде SQL, которая говорит вам, что вам нужно три индекса - один с только месяцем, один с записями по неделям, один по месяцам и один по годам (или, возможно, немного отличается в зависимости от того, как вы собираетесь выполнить запрос.
Теперь у вас есть DateTime, что представляет некоторые проблемы, и вы на самом деле хотите сделать это индексирование компонента Year для DateTime, компонента 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, и у меня его нет на этом компьютере, поэтому я не могу это проверить, но теория остается прежней.
Итак, повторить
Вы хотите индекс для вашего отчета по неделям + идентификатор продукта
Вы хотите индекс для вашего отчета по месяцам + идентификатор продукта
Вы хотите индекс для вашего отчета по году + идентификатор продукта
Надеюсь, это поможет, извините, я не могу дать вам скомпилированный пример, отсутствие вороны делает его немного сложным: -)