过滤静态RavenDB映射/减少索引



场景/上下文

  • RavenHQ上的Raven 2.0
  • Web应用程序,因此异步是首选

我的申请是调查申请。每个CCD_ 1具有一个CCD_;并且相反地每个Submission(个体对调查的响应)具有Answers的阵列。

我有一个静态索引,它汇总了所有答案,这样我就可以根据答案显示一张图表(例如,对于每个调查中的每个问题,每个选项有多少人选择)。例如,这些数据用于渲染饼图。这个聚合指数(在这个问题中讨论)基本上为每个调查的每个问题提供一个对象,并为每个选项提供总和。

问题

我想过滤这些聚合值。其中一些是琐碎的,因为它们是结果中的字段(例如通过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)))
        };

从概念上讲,我倾向于将这些过滤器"传递"到查询中,但从我所读到的内容来看,这是行不通的,因为索引值是异步索引(存储)的,没有单独的提交日期或LocationId。

这是否意味着我需要创建一个所有答案的索引,然后让聚合索引查询这个新的AllAnswers索引,或者其他什么?我已经做了一些搜索,寻找一个索引查询另一个,但运气不好。或者这就是Fields的用途??

感谢您的指导!

当前已通过Survey0和QuestionId将所有数据聚合在一起的索引。如果你想按日期或地点进行细分,这些都是新的索引。您只需将想要的字段添加到映射中,将它们包含在分组键中,然后在结果中传递它们。然后您可以通过这些键轻松地进行查询。

当您有不同的分组键时,您不能将其合并为一个索引。你必须有多个索引。例如,我可能会将您拥有的索引称为Submission_TotalsBySurveyAndQuestion以上,而另一个索引可能是Submission_TotalsBySurveyAndQuestionPerLocation

这样想吧——现在,您可以在查询中包含一个与SurveyIdQuestionId相反的WhereOrderBy,因为它们是索引中的分组键。如果要按LocationId进行筛选或排序,则必须包含该项。

你说了一句警告:

我还想根据提交日期(从元数据)进行筛选

RavenDB在元数据中给您的唯一日期(默认情况下)是Last-Modified日期。对文档的任何编辑都将对此进行更新。因此,如果提交日期对你来说很重要,那么你可能应该把它放在自己的财产里。

相关内容

  • 没有找到相关文章

最新更新