Domanda

Sto cercando un esempio di come implementare e utilizzare Map-Ridurre all'interno del RavenDB .NET client.

Mi piacerebbe applicarlo a uno scenario specifico: la generazione di conteggio dei visitatori unici e totali.

Un documento di esempio che potrebbero essere memorizzati all'interno RavenDB:

public class StatisticsEntry
{
    public string Id { get; set; }
    public string UserId { get; set; }
}

riesco a capire come creare un indice standard utilizzando Map, ma mi sono perso su come utilizzare effettivamente la funzione di ridurre, e quindi recuperare il risultato.

Purtroppo, l'esempio fornito sul sito RavenDB non spiega cosa sta succedendo in modo che mi può capire come usarlo tramite l'API .NET, ed i campioni non sembrano applicare questo a tutti utilizzando l'API .NET.

È stato utile?

Soluzione

Una mappa ridurre indice è solo un altro modo di dire "voglio fare un gruppo", solo il gruppo da è pre-definito su fronte e RavenDB elaborerà in modo efficiente in background in modo in fase di query che si sono alla ricerca di un risultato pre-calcolato.

Si consideri il seguente come una risposta come un gruppo ordinario (per utenti unici)

 var results = from doc in docs
 group doc by doc.UserId into g
 select new
 {
      g.UserId,
      g.Count()
 }

Ignorando i contenuti effettivi della matrice creato, siamo in grado di ottenere i risultati totali chiedendo

 results.Length

come ci si aspetterebbe.

In RavenDB, è diviso questa funzione in una mappa e una Ridurre, e si finisce con il

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) 
                        };
    }
}

In sostanza, questo è lo stesso come sopra - ma che hai trasformato in una funzione MapReduce; -)

 session.Query<StatisticEntry, UniqueVisitorsIndex>().Count();

vi darà il numero totale di visitatori unici, assumendo Conte è stato implementato correttamente nel provider LINQ (IIRC penso che abbia)

Il numero totale di iscrizioni è semplicemente

 session.Query<StatisticEntry>().Count();

Come ci si aspetterebbe (No Map / Reduce richiesto)

Nota: questo indice può essere utilizzato anche per vedere il numero di colpi da un utente specifico, come il Conte viene calcolato l'indice, se non vi interessa circa il conteggio poi cadere quella parte del MapReduce e fare

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
                    };
    }
}

Altri suggerimenti

Ecco come si può costruire un indice per visitatori unici:

public class Statistics_UniqueVisitors : AbstractIndexCreationTask<StatisticsEntry>
{
    public Statistics_UniqueVisitors()
    {
        Map = entries => from entry in entries
                         select new { entry.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) };
    }
}

È quindi possibile interrogare questo utilizzando:

var numberOfUniqueVisitors = s.Query<StatisticEntry, Statistics_UniqueVisitors>().Count();

Per numero totale di visitatori, è possibile utilizzare:

var numberOfVisitors = s.Query<StatisticEntry>().Count();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top