웹 사이트의 페이지 방문을 추적하는 응용 프로그램이 있습니다. 방문자가 웹 사이트로 이동하는 경우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,
};
}
}
참고,하지만 당신은 단지 사람들을 무시할 수 있습니다 :
하지만 UniqueVisitorByDate 클래스에 "UniqueVisitorId"를 추가하는 것이 이상하게 보입니다. 더 좋은 해결책이 있습니까? –
나는 알고있다. 속성의 이름을 'TempId_DO_NOT_USE'와 같이 변경하여 응용 프로그램에서 사용해서는 안됨을 나타낼 수 있습니다. – Simon
@DylanLin 'UniqueVisitorId'는 Map과 Reduce가 같은 모양의 객체를 생성해야하기 때문에 UniqueVisitorByDate에 속해야합니다. –