2012-09-06 5 views
2

MapReduce를 줄이려는 상황이 자주 발생합니다. 예를 들어 하나의 객체에서 버전을 가져오고 싶은 객체가 두 개 있고 다른 객체에서 개수를 계산 한 경우입니다.RavenDB MapReduce MapReduce 결과를 줄이거 나 집계

public class Visit { 
    public string Id { get; set; } 
    public string Version { get; set; } 
} 

public class Search { 
    public string Id { get; set; } 
    public string VisitId { get; set; } 
} 

public class MapReduceResult { 
    public string VisitId { get; set; } 
    public string Version { get; set; } 
    public int Count { get; set; } 
} 

감소시킬 때 ID 및 버전별로 방문 및 검색을 그룹화하여 버전 당 검색 횟수를 얻을 수 있습니다. 불행히도 매 방문마다 하나의 행이있을 것이고, 우리는 그 중 수백만 개를 말하고 있습니다. 따라서 클라이언트 측으로 데이터를 가져 오는 것이 선호되는 방법이 아니며, 또한 1024 개체 제한이 너무 복잡합니다.

어떻게 든 MapReduce를 줄일 수 있다면이 문제는 해결 될 것입니다. 그런 다음 버전으로 두 번째로 그룹화하면 VisitId를 완전히 무시하고 모든 계산을 요약합니다. 이 일을하는 방법이 있습니까?

Sum도 쿼리 가능하므로 서버 측 옵션이 부족한 것 같습니다.

너희들은 어떤 생각을 가지고 있니, 전혀 이해가 되니?

답변

0

당신에게 인덱스 관련 문서 수있는 새로운 기능이 추가되었습니다 RavenDB의 릴리스 2.0 가입일 : 귀하의 경우

http://ravendb.net/docs/2.0/client-api/querying/static-indexes/indexing-related-documents

인덱스의 모습 :

public class Index : AbstractIndexCreationTask<Search, Index.Result> 
{ 
    public class Result 
    { 
     public string Version { get; set; } 
     public int Count { get; set; } 
    } 

    public Index() 
    { 
     Map = searches => from search in searches 
          let visit = LoadDocument<Visit>(search.VisitId) 
          select new Result 
            { 
             Version = visit.Version, 
             Count = 1 
            }; 

     Reduce = results => from result in results 
          group result by result.Version 
          into g 
          select new Result 
             { 
              Version = g.Key, 
              Count = g.Sum(x => x.Count) 
             }; 
    } 
}