Я новичок в RavenDB и до сих пор люблю его. У меня есть один оставшийся индекс для моего проекта.RavenDB Map/Reduce/Transform на вложенных массивах переменной длины
Проблема
У меня есть тысячи ответов на опросы (т.е. «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...
]
}
Больше Проблема: я должен иметь возможность фильтровать по SurveyId, LocationId, QuestionID, дата создания. Насколько я понимаю, это делается во время запроса ... Мне просто нужно убедиться, что эти свойства присутствуют в результате преобразования (или это результат уменьшения? Или оба?). Если я прав, тогда это не проблема.
Требуемый результат
Нам нужен один объект на каждый вопрос в опросе, который дает сумму каждого варианта. Надеюсь, это Спроецировать
[
{
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
}
},
...
]
Моя попытка
Я не очень далеко, и я думаю, что this post катится меня на правильный путь, но это не помогает мне со списком значений. Я искал и искал, но не могу найти никакого направления для того, что делать с вложенным массивом. Вот что у меня до сих пор:
КАРТА:
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
}
УМЕНЬШИТЬ:
??
ТРАНСФОРМ:
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
}
Для чего это стоит, это размещается на RavenHQ.
Это было так долго, что я работал над этим и не могу понять это правильно. Любая помощь в получении меня к требуемому результату очень ценится!
... и спасибо за подсказку использовать IList> на v2.0 –
Это хорошо работает, но есть также требование фильтрации по полям, не присутствующим в преобразовании. Класс результата (например, я только хотите, чтобы данные поступали в течение определенного периода времени). Это достаточно большой вопрос, который я должен задать в качестве отдельного вопроса? –
Ну, я не вижу никаких дат ни на одном из этих объектов, и решение здесь не имеет преобразования, поэтому, вероятно, вы должны открыть новый вопрос только с конкретной спецификой этой проблемы. –