Ответ 1
Индекс сокращения карты - это еще один способ сказать "Я хочу сделать группу по", только предварительно определенная группа, и RavenDB будет обрабатывать ее эффективным образом в фоновом режиме, поэтому во время запроса вы ищут предварительно рассчитанный результат.
Рассмотрите следующее как ответ как обычную группу (для уникальных пользователей)
var results = from doc in docs
group doc by doc.UserId into g
select new
{
g.UserId,
g.Count()
}
Игнорируя фактическое содержимое созданного массива, мы можем получить итоговые результаты, запросив
results.Length
как вы ожидали.
В RavenDB вы разделите эту функцию на карту и уменьшите, и вы получите
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();
Как и следовало ожидать (не требуется карта/сокращение)
Примечание. Этот индекс также можно использовать для просмотра количества обращений конкретного пользователя, так как граф вычисляется в индексе, если вы не заботитесь о счете, а затем опустите эту часть 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
};
}
}