2013-07-16 24 views
1

情景/背景上RavenHQ过滤静态RavenDB地图/减少指数

  • 乌鸦2.0
  • 的Web应用程序,所以异步优选

我的应用程序是一个调查应用。每个Survey有一个Questions;相反,每个Submission(个人对调查的回应)有一个Answers阵列。

我有一个静态索引来汇总所有答案,以便我可以根据回答显示图表(例如,对于每个调查中的每个问题,有多少人选择每个选项)。这些数据用于呈现,例如饼图。这个聚集指数(在this question中讨论)基本上给每个调查每个问题提供一个对象,每个选项的总和。

问题

我想过滤这些汇总值。其中一些是微不足道的,因为它们是结果中的字段(例如,由SurveyIdQuestionId过滤)。但是,我还希望根据提交日期(来自元数据)或LocationId进行过滤,这些字段在单个Submissions中的字段中,但显然不在聚合结果中。

换句话说,我需要能够询问Raven关于特定LocationId或本月的问题的结果。

下面是一个提交基本上看起来像:

{ 
    "SurveyId": 1, 
    "LocationId": 1, 
    "Answers": [ 
    { 
     "QuestionId": 1, 
     "Values": [2,8,32], 
     "Comment": null 
    }, 
    { 
     "QuestionId": 2, 
     "Values": [4], 
     "Comment": "Lorem ipsum" 
    }, 
    ...more answers... 
    ] 
} 

目前,这里的聚合结果:

public class Result 
{ 
    public int SurveyId { get; set; } // 1 
    public int QuestionId { get; set; } // 1 
    public int NumResponses { get; set; } // 576 
    public int NumComments { get; set; } // 265 
    public IList<KeyValuePair<int,int>> Values { get; set; } // [{Key:1, Value:264}, {Key:2, Value:163}, Key:4, Value:391}, ...] 
} 

这里的聚集度指数:

Map = submissions => 
    from submission in submissions 
    from answer in submission.Answers 
    select new 
    { 
     submission.SurveyId, 
     answer.QuestionId, 
     NumResponses = 1, 
     NumComments = answer.Comment == null ? 0 : 1, 
     Value = answer.Value.Select(x => new KeyValuePair<int, int>(x, 1)) 
    }; 

Reduce = results => 
    from result in results 
    group result by new { result.SurveyId, result.QuestionId } 
     into g 
     select new Result 
     { 
      SurveyId = g.Key.SurveyId, 
      QuestionId = g.Key.QuestionId, 
      NumResponses = g.Sum(x => x.NumResponses), 
      NumComments = g.Sum(x => x.NumComments), 
      Value = g.SelectMany(x => x.Value) 
         .GroupBy(x => x.Key) 
         .Select(x => new KeyValuePair<int, int>(x.Key, x.Sum(y => y.Value))) 
     }; 

我在概念上倾向于将这些过滤器“传入”查询,但从我读过的内容来看,这将无法正常工作,因为索引值在没有单独提交日期或LocationIds的情况下被异步索引(存储) 。

这是否意味着我需要创建所有答案的索引,然后让聚合索引查询这个新的AllAnswers索引,或者什么?我已经做了一点寻找另一个索引查询,没有运气。或者这是什么领域用于?

任何指导表示赞赏!

回答

2

您目前将所有数据汇总在一起的索引由SurveyIdQuestionId组成。如果您希望按照日期或地点分解,那么这些都是新的索引。您只需将想要的字段添加到地图中,将它们包含在分组键中,然后在结果中传递它们。然后你可以通过这些键轻松查询。

如果您有不同的分组键,则无法将其合并到单个索引中。你必须有多个索引。例如,我可能会将您的索引称为Submission_TotalsBySurveyAndQuestion以上,另一个索引可能是Submission_TotalsBySurveyAndQuestionPerLocation

认为它这样 - 现在,您可以在您的查询违背了SurveyIdQuestionId一个WhereOrderBy - 因为那些在索引分组关键字。如果要过滤或按LocationId排序,那必须包括在内。谨慎的

一个字,你说:

我也想通过提交的日期(从元数据)

唯一的日期RavenDB让你在元数据过滤(默认)是日期的Last-Modified。对文档的任何编辑都会更新它。因此,如果提交日期对您很重要,那么您应该将其保留在自己的财产中。