Un índice de reducción de mapa es solo otra forma de decir "Quiero hacer un grupo por", solo el grupo de es pre -definido desde el principio y RavenDB lo procesará de manera eficiente en segundo plano, por lo que en el momento de la consulta está buscando un resultado precalculado.
Considere lo siguiente como una respuesta como un grupo ordinario por (para usuarios únicos)
var results = from doc in docs
group doc by doc.UserId into g
select new
{
g.UserId,
g.Count()
}
Haciendo caso omiso de los contenidos reales de la matriz creada, podemos obtener los resultados totales pidiendo
results.Length
como era de esperar.
En RavenDB, que divide a cabo esta función en un mapa y la escala de reducción, y se termina con
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)
};
}
}
En esencia, esto es lo mismo que el anterior - pero has lo convirtió en una MapReduce función ;-)
session.Query<StatisticEntry, UniqueVisitorsIndex>().Count();
le dará el número total de visitantes únicos, asumiendo conde se ha implementado correctamente en el proveedor de LINQ (IIRC creo que tiene)
el total número de entradas es simplemente
session.Query<StatisticEntry>().Count();
Como era de esperar (No hay ningún mapa/reducir requerido)
Nota: este índice también se puede utilizar para ver el número de golpes por un usuario específico, como el conde se calcula en el índice, si no le importa el conteo, suelte esa parte de MapReduce y haga
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
};
}
}
¿Qué quiere lograr? ¿Quieres usar la hora de la fecha de alguna manera? (Por día, por mes, por año un poco las cosas?) –
No en este momento. Es posible que tenga índices adicionales más adelante usando este campo. Por el momento, lo eliminaré de la clase para simplificarlo. En cuanto a "Querer lograr", quiero generar estadísticas que muestren a) el recuento total de StatisticsEntry yb) los usuarios únicos. –
De acuerdo, porque necesitaría un mapa/reducir el índice por 'agrupamiento' en ese tipo de escenario; la respuesta aparece en un momento –