情景/背景上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索引,或者什麼?我已經做了一點尋找另一個索引查詢,沒有運氣。或者這是什麼領域用於?
任何指導表示讚賞!