Индекс уменьшения карты - это просто еще один способ сказать «Я хочу сделать группу по», заранее определена только группа по, и RavenDB будет эффективно обрабатывать ее в фоновом режиме, поэтому во время запроса выищем предварительно вычисленный результат.
Рассмотрим следующее как ответ как обычную группу (для уникальных пользователей)
var results = from doc in docs
group doc by doc.UserId into g
select new
{
g.UserId,
g.Count()
}
Игнорируя фактическое содержимое созданного массива, мыможно получить итоговые результаты, запросив
results.Length
, как и следовало ожидать.
В RavenDB вы разделили эту функцию на Map и Reduce и в итоге получили
public class UniqueVisitorsResult
{
public string UserId { get; set; }
public int Count { get; set; }
}
public class UniqueVisitorsIndex : AbstractIndexCreationTask<StatisticsEntry, UniqueVisitorsResult>
{
public UniqueVisitorsIndex ()
{
Map = docs=> from doc in docs
select new
{
UserId = doc.UserId,
Count = 1
};
Reduce = results => from result in results
group result by result.UserId into g
select new
{
UserId = g.Key,
Count = g.Sum(x=>x.Count)
};
}
}
По сути, это то же самое, что и выше - но вы превратили его в функцию MapReduce; -)
session.Query<StatisticEntry, UniqueVisitorsIndex>().Count();
Даст вам общее количество уникальных посетителей.при условии, что Count был правильно реализован в поставщике LINQ (iirc, я думаю, что он есть)
Общее количество записей просто
session.Query<StatisticEntry>().Count();
Как и следовало ожидать (без карты / уменьшениятребуется)
Примечание: этот индексex также может использоваться для просмотра количества обращений конкретного пользователя, так как Count рассчитывается в индексе, если вы не заботитесь о подсчете, отбросьте эту часть MapReduce и выполните
public class UniqueVisitorsIndex : AbstractIndexCreationTask<StatisticsEntry>
{
public UniqueVisitorsIndex ()
{
Map = docs=> from doc in docs
select new
{
UserId = doc.UserId
};
Reduce = results => from result in results
group result by result.UserId into g
select new
{
UserId = g.Key
};
}
}