2013-07-16 29 views
1

情景/背景上RavenHQ過濾靜態RavenDB地圖/減少指數

  • 烏鴉2.0
  • 的Web應用程序,所以異步優選

我的應用程序是一個調查應用。每個Survey有一個Questions;相反,每個Submission(個人對調查的迴應)有一個Answers陣列。

我有一個靜態索引來彙總所有答案,以便我可以根據回答顯示圖表(例如,對於每個調查中的每個問題,有多少人選擇每個選項)。這些數據用於呈現,例如餅圖。這個聚集指數(在this question中討論)基本上給每個調查每個問題提供一個對象,每個選項的總和。

問題

我想過濾這些彙總值。其中一些是微不足道的,因爲它們是結果中的字段(例如,由SurveyIdQuestionId過濾)。但是,我還希望根據提交日期(來自元數據)或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索引,或者什麼?我已經做了一點尋找另一個索引查詢,沒有運氣。或者這是什麼領域用於?

任何指導表示讚賞!

回答

2

您目前將所有數據彙總在一起的索引由SurveyIdQuestionId組成。如果您希望按照日期或地點分解,那麼這些都是新的索引。您只需將想要的字段添加到地圖中,將它們包含在分組鍵中,然後在結果中傳遞它們。然後你可以通過這些鍵輕鬆查詢。

如果您有不同的分組鍵,則無法將其合併到單個索引中。你必須有多個索引。例如,我可能會將您的索引稱爲Submission_TotalsBySurveyAndQuestion以上,另一個索引可能是Submission_TotalsBySurveyAndQuestionPerLocation

認爲它這樣 - 現在,您可以在您的查詢違背了SurveyIdQuestionId一個WhereOrderBy - 因爲那些在索引分組關鍵字。如果要過濾或按LocationId排序,那必須包括在內。謹慎的

一個字,你說:

我也想通過提交的日期(從元數據)

唯一的日期RavenDB讓你在元數據過濾(默認)是日期的Last-Modified。對文檔的任何編輯都會更新它。因此,如果提交日期對您很重要,那麼您應該將其保留在自己的財產中。