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