2012-05-15 2 views
3

웹 사이트의 페이지 방문을 추적하는 응용 프로그램이 있습니다. 방문자가 웹 사이트로 이동하는 경우Raven DB : "UniqueVisitorCount by date"인덱스를 만드는 방법

public class VisitSession { 
    public string SessionId { get; set; } 
    public DateTime StartTime { get; set; } 
    public string UniqueVisitorId { get; set; } 
    public IList<PageVisit> PageVisits { get; set; } 
} 

이 방문 세션을 시작합니다 여기 내 모델입니다. 하나의 방문 세션에는 많은 페이지 방문이 있습니다. 추적기는 방문자가 웹 사이트에 처음 방문 할 때 UniqueVisitorId (GUID) 쿠키를 작성합니다. 그래서 우리는 방문객이 방문객을 돌려주고 있는지 알 수 있습니다.

이제 순 방문자수이 일정 기간 동안 얼마나 많은 웹 사이트를 방문했는지 알고 싶습니다. 즉, 우리 웹 페이지에 다음과 같이 테이블을 표시하고 싶습니다.

Date  | Unique Visitors Count 
------------+----------------------- 
2012-05-01 | 100 
2012-05-02 | 1000 
2012-05-03 | 120 

이렇게하려면 RavenDB에서 색인을 생성하고 싶습니다. 그러나 Map/Reduce 쿼리를 작성하는 방법을 모르겠습니다. 나는 이것 같이 일 수 있더라도 :

public class UniqueVisitor_ByDate : AbstractIndexCreationTask<VisitSession, UniqueVisitorByDate> 
{ 
    public UniqueVisitor_ByDate() 
    { 
     Map = sessions => from s in sessions 
          select new 
          { 
           s.StartTime.Date, 
           s.UniqueVisitorId 
          }; 

     Reduce = results => from result in results 
          group result by result.Date into g 
          select new 
          { 
           Date = g.Key, 
           UniqueVisitorCount = g.Distinct() 
          }; 
    } 
} 

그러나 그것은 작동하지 않는다. Ayende의 전자 서적에서 Map 함수의 결과는 Reduce 함수의 결과와 동일해야 함을 알고 있습니다. 그렇다면 어떻게하면 정확한지도/함수를 작성할 수 있습니까? 는 '감소'맵에서 ​​'수'속성에 추가 'UniqueVisitorId'속성을 필요로

public class UniqueVisitor_ByDate : AbstractIndexCreationTask<VisitSession, UniqueVisitorByDate> 
{ 
    public UniqueVisitor_ByDate() 
    { 
     Map = sessions => from s in sessions 
          select new 
            { 
             s.StartTime.Date, 
             s.UniqueVisitorId, 
             Count = 1, 
            }; 

     Reduce = results => from result in results 
          group result by result.Date 
          into g 
          select new UniqueVisitorByDate 
             { 
              Date = g.Key, 
              Count = g.Select(x => x.UniqueVisitorId).Distinct().Count(), 
              UniqueVisitorId = g.FirstOrDefault().UniqueVisitorId, 
             }; 
    } 
} 

참고,하지만 당신은 단지 사람들을 무시할 수 있습니다 :

답변

4

이 지수는 당신이 원하는 것을해야 .

+0

하지만 UniqueVisitorByDate 클래스에 "UniqueVisitorId"를 추가하는 것이 이상하게 보입니다. 더 좋은 해결책이 있습니까? –

+0

나는 알고있다. 속성의 이름을 'TempId_DO_NOT_USE'와 같이 변경하여 응용 프로그램에서 사용해서는 안됨을 나타낼 수 있습니다. – Simon

+1

@DylanLin 'UniqueVisitorId'는 Map과 Reduce가 같은 모양의 객체를 생성해야하기 때문에 UniqueVisitorByDate에 속해야합니다. –

관련 문제