场景/上下文
- RavenHQ上的Raven 2.0
- Web应用程序,因此异步是首选
我的申请是调查申请。每个CCD_ 1具有一个CCD_;并且相反地每个Submission
(个体对调查的响应)具有Answers
的阵列。
我有一个静态索引,它汇总了所有答案,这样我就可以根据答案显示一张图表(例如,对于每个调查中的每个问题,每个选项有多少人选择)。例如,这些数据用于渲染饼图。这个聚合指数(在这个问题中讨论)基本上为每个调查的每个问题提供一个对象,并为每个选项提供总和。
问题
我想过滤这些聚合值。其中一些是琐碎的,因为它们是结果中的字段(例如通过SurveyId
或QuestionId
进行过滤)。但是,我也想按提交日期(来自元数据)或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的用途??
感谢您的指导!
当前已通过Survey
0和QuestionId
将所有数据聚合在一起的索引。如果你想按日期或地点进行细分,这些都是新的索引。您只需将想要的字段添加到映射中,将它们包含在分组键中,然后在结果中传递它们。然后您可以通过这些键轻松地进行查询。
当您有不同的分组键时,您不能将其合并为一个索引。你必须有多个索引。例如,我可能会将您拥有的索引称为Submission_TotalsBySurveyAndQuestion
以上,而另一个索引可能是Submission_TotalsBySurveyAndQuestionPerLocation
。
这样想吧——现在,您可以在查询中包含一个与SurveyId
或QuestionId
相反的Where
或OrderBy
,因为它们是索引中的分组键。如果要按LocationId
进行筛选或排序,则必须包含该项。
你说了一句警告:
我还想根据提交日期(从元数据)进行筛选
RavenDB在元数据中给您的唯一日期(默认情况下)是Last-Modified
日期。对文档的任何编辑都将对此进行更新。因此,如果提交日期对你来说很重要,那么你可能应该把它放在自己的财产里。