2011-03-23 5 views
6

스트리밍 비디오가 포함 된 사이트가 있으며 지난 주, 월 및 연도 (롤링 창)에 가장 많이 본 동영상에 대한 세 가지 보고서를 표시하려고합니다.여러 필드로 구성된지도 편집

우리는 비디오 감시한다 ravendb마다에서 문서를 저장 :

public class ViewedContent 
{ 
    public string Id { get; set; } 
    public int ProductId { get; set; } 
    public DateTime DateViewed { get; set; } 
} 

우리는 문제가 최선의 지원이 세 가지 보고서를 생성 할 인덱스/mapreduces을 정의하는 방법을 알아내는 데있어.

다음 map/reduce를 시도했습니다. 때문에,이 실제로 컴파일되지 않습니다

var lastSevenDays = session.Query<ViewedContent, ViewedContentIndex>() 
       .Where(x => x.DateViewed > DateTime.UtcNow.Date.AddDays(-7)) 
       .GroupBy(x => x.ProductId) 
       .OrderBy(x => x.Count) 

:

var lastSevenDays = session.Query<ViewedContent, ViewedContentIndex>() 
       .Where(x => x.DateViewed > DateTime.UtcNow.Date.AddDays(-7)); 
궁극적으로

Error: "DateViewed is not indexed"

, 우리는 뭔가를 조회 할 :

public class ViewedContentResult 
{ 
    public int ProductId { get; set; } 
    public DateTime DateViewed { get; set; } 
    public int Count { get; set; } 
} 

public class ViewedContentIndex : 
     AbstractIndexCreationTask<ViewedContent, ViewedContentResult> 
{ 
    public ViewedContentIndex() 
    { 
     Map = docs => from doc in docs 
         select new 
           { 
            doc.ProductId, 
            DateViewed = doc.DateViewed.Date, 
            Count = 1 
           }; 

     Reduce = results => from result in results 
          group result by result.DateViewed 
          into agg 
          select new 
             { 
              ProductId = agg.Key, 
              Count = agg.Sum(x => x.Count) 
             }; 
    } 
} 

그러나,이 쿼리에서 오류가 발생합니다 OrderBy가 잘못되었습니다. Count가 유효한 속성이 아닙니다.

여기에 도움을 주시면 감사하겠습니다.

답변

9

각 보고서는 SQL 토지에있는 경우 다른 월별 색인, 즉 한 달, 한주, 한 달, 한 달, 한 달 등 세 가지 색인이 필요하다는 것을 나타냅니다. 어쩌면 약간의 차이가있을 수 있습니다.

여기에 DateTime이 있습니다. 몇 가지 문제점이 있습니다. 실제로에 원하는 것은 DateTime의 Year 구성 요소를 색인하는 것입니다. 해당 날짜 시간의 날짜 및 시간 구성 요소의 월 구성 요소 (또는 생성하려는 보고서에 따라 이들 중 하나 또는 두 개)

나는 단지 인용구를 사용하고 있습니다. 당신이 컴파일되지 않습니다 분명 그래서 여기에 코드 만 :

public class ViewedContentIndex : 
    AbstractIndexCreationTask<ViewedContent, ViewedContentResult> 
{ 
public ViewedContentIndex() 
{ 
    Map = docs => from doc in docs 
        select new 
          { 
           doc.ProductId, 
           Day = doc.DateViewed.Day, 
           Month = doc.DateViewed.Month, 
           Year = doc.DateViewed.Year 
           Count = 1 
          }; 

    Reduce = results => from result in results 
         group result by new { 
          doc.ProductId, 
          doc.DateViewed.Day, 
          doc.DateViewed.Month, 
          doc.DateViewed.Year 
         } 
         into agg 
         select new 
            { 
             ProductId = agg.Key.ProductId, 
             Day = agg.Key.Day, 
             Month = agg.Key.Month, 
             Year = agg.Key.Year 
             Count = agg.Sum(x => x.Count) 
            }; 
} 

} 희망

당신은 내가 이것에 의해 달성하기 위해 노력하고있어 볼 수 있습니다 - 당신이하여 그룹의 모든 구성 요소를 원하는대로 그들은 당신의 그룹을 독특하게 만드는 것입니다.

RavenDB에서 DateTimes에서이 작업을 수행 할 수 있는지,이 컴퓨터에서이 작업을 수행 할 수 없으므로이를 확인할 수 없지만 이론은 동일하게 유지되는지 기억이 안납니다.

그래서, 다시 반복

을 당신은 당신이 연도 별 보고서에 대한 인덱스를 원하는 달 + 제품 ID 하여 보고서에 대한 인덱스를 원하는 주 + 제품 ID 하여 보고서에 대한 인덱스를 원하는 + 제품 ID

나는이 도움이 되었으면 좋겠

미안 나는 그것을했다, 까마귀의 부족이 조금 어려운 :-)

+0

응하게 당신에게 컴파일 가능한 예를 들어 줄 수 없다! 여기서 정신적 인 변화는 단지 내가 아니라 물체를 그룹화 할 수 있다는 것을 보았습니다. 궁극적으로 우리는 날짜의 롤링 창에서 쿼리해야합니다. 그러나 이것은 내가 필요한 것을 정확하게 제공합니다. 다시 한 번 감사드립니다! –

관련 문제