Jay*_*ido 4 mapreduce ravendb ravenhq
我是RavenDB的新手,到目前为止我很喜欢它.我有一个剩余的索引要为我的项目创建.
问题
我有数以千计的调查回复(即" Submissions"),每个提交都有一系列特定问题的答案(即" Answers"),每个答案都有一系列选择的选项(即" Values").
这是一个Submission基本上看起来像:
{
"SurveyId": 1,
"LocationId": 1,
"Answers": [
{
"QuestionId": 1,
"Values": [2,8,32],
"Comment": null
},
{
"QuestionId": 2,
"Values": [4],
"Comment": "Lorem ipsum"
},
...more answers...
]
}
Run Code Online (Sandbox Code Playgroud)
更多问题:我必须能够通过SurveyId,LocationId,QuestionId,Creation Date进行过滤.据我所知,这是在查询时完成的...我只需要确保转换结果中存在这些属性(或者是减少结果?还是两者都有?).如果我是对的,那么这不是一个问题.
所需结果
每个调查每个问题需要一个对象,给出每个选项的总和.希望它是自我解释的:
[
{
SurveyId: 1,
QuestionId: 1,
NumResponses: 976,
NumComments: 273,
Values: {
"1": 452, // option 1 selected 452 times
"2": 392, // option 2 selected 392 times
"4": 785 // option 4 selected 785 times
}
},
{
SurveyId: 1,
QuestionId: 2,
NumResponses: 921,
NumComments: 46,
Values: {
"1": 325,
"2": 843,
"4": 119,
"8": 346,
"32": 524
}
},
...
]
Run Code Online (Sandbox Code Playgroud)
我的尝试
我没有走得太远,我认为这篇文章让我走上了正确的道路,但它并没有帮助我获得值列表.我已经搜索过并搜索过但无法找到任何关于嵌套数组的方向.这是我到目前为止:
地图:
from submission in docs.Submissions
from answer in submission.Answers
where answer.WasSkipped != true && answer.Value != null
select new {
SubmissionDate = submission["@metadata"]["Last-Modified"],
SurveyId = submission.SurveyId,
LocationId = submission.LocationId,
QuestionId = answer.QuestionId,
Value = answer.Value
}
Run Code Online (Sandbox Code Playgroud)
降低:
??
Run Code Online (Sandbox Code Playgroud)
转变:
from result in results
from answer in result.Answers
where answer.WasSkipped != true && answer.Value != null
select new {
SubmissionDate = result["@metadata"]["Last-Modified"],
SurveyId = result.SurveyId,
LocationId = result.LocationId,
QuestionId = answer.QuestionId,
Value = answer.Value
}
Run Code Online (Sandbox Code Playgroud)
对于它的价值,这是托管在RavenHQ上.
已经很久了,我一直在研究这个并且无法做到这一点.任何帮助我获得所需结果的帮助非常感谢!
假设您的C#类看起来像这样:
public class Submission
{
public int SurveyId { get; set; }
public int LocationId { get; set; }
public IList<Answer> Answers { get; set; }
}
public class Answer
{
public int QuestionId { get; set; }
public int[] Values { get; set; }
public string Comment { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果您运行的是RavenDB 2.5.2637或更高版本,则现在可以使用字典结果类型:
public class Result
{
public int SurveyId { get; set; }
public int QuestionId { get; set; }
public int NumResponses { get; set; }
public int NumComments { get; set; }
public Dictionary<int, int> Values { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果您之前运行的任何内容(包括2.0版本),那么您将无法使用字典,但您可以使用字典IList<KeyValuePair<int,int>>.
这是索引:
public class TestIndex : AbstractIndexCreationTask<Submission, Result>
{
public TestIndex()
{
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,
Values = answer.Values.ToDictionary(x => x, x => 1)
//Values = answer.Values.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
{
g.Key.SurveyId,
g.Key.QuestionId,
NumResponses = g.Sum(x => x.NumResponses),
NumComments = g.Sum(x => x.NumComments),
Values = g.SelectMany(x => x.Values)
.GroupBy(x => x.Key)
.ToDictionary(x => x.Key, x => x.Sum(y => y.Value))
//.Select(x => new KeyValuePair<int, int>(x.Key, x.Sum(y => y.Value)))
};
}
}
Run Code Online (Sandbox Code Playgroud)
(不需要转换步骤.)
如果你不能使用2.5.2637或更高版本,那么用.ToDictionary它们下面的注释行替换这些行,并IList<KeyValuePair<int,int>>在结果类中使用a .
允许在地图/缩减中使用词典的修复程序是基于您的帖子帮助识别的此问题.谢谢!
| 归档时间: |
|
| 查看次数: |
859 次 |
| 最近记录: |