2010-11-23 7 views
22

RavenDB .NET 클라이언트에서 Map-Reduce를 구현하고 사용하는 방법의 예제를 찾고 있습니다.RavenDB Map-Reduce .NET 클라이언트를 사용한 예제

특정 시나리오에 적용하고 싶습니다 : 순 방문자 수 및 총 방문자 수 생성. RavenDB에 저장 될 수

샘플 문서 :

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

나는지도를 사용하여 표준 인덱스를 생성하는 방법을 알아낼 수 있지만 실제로이 기능을 감소 사용하는 방법에 관해서는 잃었어요, 그리고 그런 다음 결과를 검색하십시오.

불행히도 example provided on the RavenDB Site은 무슨 일이 일어나고 있는지 설명하지 않고 .NET API를 통해이 API를 사용하는 방법을 이해할 수 있으며 .NET API를 사용하여 샘플을 구현하지 않는 것 같습니다.

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

당신은 다음 사용하여이를 조회 할 수 있습니다 : 여기

+0

달성하고자하는 것은 무엇입니까? 어떤 방식 으로든 날짜 시간을 사용하고 싶습니까? (일일, 월간, 년 당 일종의) –

+0

현재는 없습니다. 나중에이 필드를 사용하여 추가 인덱스를 가질 수 있습니다. 잠시 동안 나는 그것을 단순화하기 위해 수업에서 제거 할 것입니다. "달성하고 싶다"에 관해서는 - 통계를 생성하고 싶습니다. a) 총 통계 수 및 b) 고유 사용자. –

+0

알았어 - 그런 종류의 시나리오에서 '그룹화'당 하나의지도/색인이 필요하기 때문에 - 답변이 jiffy에 올라오고 있습니다. –

답변

38

지도 축소 색인은 "그룹별로 수행하고 싶다"는 또 다른 표현입니다. 사전 정의 된 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) 
         }; 
    } 
} 

와 끝까지,이는 상기와 동일합니다 -하지만 당신은로를 설정했습니다 맵리 듀스 기능 ;-)

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

이 카운트 가정, 당신에게 고유 방문자의 총 수를 줄 것이다는 LINQ 공급자 (IIRC 나는 그것이 있다고 생각)

전체에서 제대로 구현되었습니다 당신은 (어떤지도/필요한 감소 없음) 기대대로 항목의 수는 단순히

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

입니다

참고 :이 지수는 백작으로, 특정 사용자가 히트 수를 볼 수 있습니다 계산에 신경 쓰지 않는다면 MapReduce의 해당 부분을 삭제하고

+0

굉장합니다. 설명 해줘서 고마워. –

+0

첫 번째 예제에서는'Count = g.Sum (x => x.Count)'를 제공합니다.'x '는'StatisticsEntry' 유형이므로 컴파일 오류가 발생합니다 - 이것은 어디서 발생 했습니까? –

+1

아, 출력 모양을 정의하고 예제를 수정하겠습니다 :) –

18

당신은 고유 방문자에 대한 인덱스 구축 할 수있는 방법입니다

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

방문자의 총 개수를 들어, 당신은 사용할 수 있습니다

var numberOfVisitors = s.Query<StatisticEntry>().Count();