情景/背景上RavenHQ过滤静态RavenDB地图/减少指数
- 乌鸦2.0
- 的Web应用程序,所以异步优选
我的应用程序是一个调查应用。每个Survey
有一个Questions
;相反,每个Submission
(个人对调查的回应)有一个Answers
阵列。
我有一个静态索引来汇总所有答案,以便我可以根据回答显示图表(例如,对于每个调查中的每个问题,有多少人选择每个选项)。这些数据用于呈现,例如饼图。这个聚集指数(在this question中讨论)基本上给每个调查每个问题提供一个对象,每个选项的总和。
问题
我想过滤这些汇总值。其中一些是微不足道的,因为它们是结果中的字段(例如,由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)))
};
我在概念上倾向于将这些过滤器“传入”查询,但从我读过的内容来看,这将无法正常工作,因为索引值在没有单独提交日期或LocationIds的情况下被异步索引(存储) 。
这是否意味着我需要创建所有答案的索引,然后让聚合索引查询这个新的AllAnswers索引,或者什么?我已经做了一点寻找另一个索引查询,没有运气。或者这是什么领域用于?
任何指导表示赞赏!