Mapa RavenDB-zmniejsz przykład using.NET Klient

Szukam przykładu jak zaimplementować i wykorzystać Map-Reduce w kliencie RAVENDB. NET.

Chciałbym zastosować to do konkretnego scenariusza: generowania unikalnych i całkowitych liczników odwiedzających.

Przykładowy dokument, który byłby przechowywany w RavenDB:

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

Mogę dowiedzieć się, jak utworzyć standardowy indeks za pomocą Map, ale nie wiem, jak faktycznie użyć funkcji Reduce, a następnie pobrać wyniki.

Niestety, przykład podany na stronie RavenDB nie wyjaśnia, co się dzieje, więc mogę zrozumieć, jak z niego korzystać za pośrednictwem. NET API, a próbki nie wydają się implementować to w ogóle za pomocą. NET API.

Author: Rob Ashton, 2010-11-23

2 answers

Wskaźnik redukcji mapy to kolejny sposób na powiedzenie "chcę zrobić grupę według", tylko grupa według jest wstępnie zdefiniowana z góry, a RavenDB przetworzy ją w efektywny sposób w tle, więc w czasie kwerendy szukasz wstępnie obliczonego wyniku.

Potraktuj poniższe jako odpowiedź jako zwykłą grupę przez (dla unikalnych użytkowników)

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

Ignorując rzeczywistą zawartość utworzonej tablicy, możemy uzyskać całkowite wyniki pytając o

 results.Length

As you ' d spodziewaj się.

W RavenDB dzielisz tę funkcję na mapę i redukcję, a kończy się na

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

Zasadniczo jest to to samo co wyżej - ale zamieniłeś to w funkcję MapReduce; -)

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

Poda całkowitą liczbę unikalnych odwiedzających, zakładając, że Count został poprawnie zaimplementowany w LINQ provider (IIRC myślę, że tak)

Całkowita liczba wpisów to po prostu

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

Jak można się spodziewać (bez mapy/reduce wymagane)

Uwaga: ten indeks może być również używany, aby zobaczyć liczbę wyświetleń określonego użytkownika, ponieważ liczba jest obliczana w indeksie, jeśli nie zależy ci na liczbie, rzuć tę część MapReduce i wykonaj

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
                    };
    }
}
 38
Author: Rob Ashton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-23 13:24:29

Oto jak możesz zbudować indeks unikalnych odwiedzających:

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

Możesz następnie odpytywać za pomocą:

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

Dla całkowitej liczby odwiedzających, można użyć:

var numberOfVisitors = s.Query<StatisticEntry>().Count();
 18
Author: Ayende Rahien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-28 22:50:32