2012-09-20 28 views
3

上次使用和使用次數上的我的總和和最大呼叫錯誤。它們始終是存儲在當前設置爲0的第二個映射值中的值。我可以將其設置爲-100,這就是減少結果的內容。我注意到有人說你應該讓它成爲一個數組,但我不明白這有什麼用處。我有一個linq表達式,使用map/reduce的對象來正常工作,假定兩個地圖聯合在一起。Raven DB:這個multimap/reduce索引有什麼問題?

這裏的數據=>https://gist.github.com/940ccca1b0f8917e9eaf

我想支持像

 var stats = Session.Query<MultiMapApiKeyStats.ApiKeyStats, MultiMapApiKeyStats>() 
      .Customize(x => x.WaitForNonStaleResultsAsOfNow()) 
      .Where(x => x.AccountId == Account.Id) 
      .OrderBy(x => x.Key).ToList(); 

查詢,並建立一個表像 table

public MultiMapApiKeyStats() 
     { 
      AddMap<KeyUsageBase>(uses => from use in uses 
             select new 
             { 
              AccountId = use.AccountId, 
              ApiKeyId = use.ApiKeyId, 
              Key = (string)null, 
              UsageCount = 1, 
              LastUsed = use.LastUsedTicks, 
              Pattern = (string)null, 
              Status = ApiKey.KeyStatus.None, 
              Type = ApiKey.ApplicationType.None 
             }); 
      AddMap<ApiKey>(keys => from key in keys 
            select new 
              { 
               AccountId = key.AccountId, 
               ApiKeyId = key.Id, 
               Key = key.Key, 
               UsageCount = 0, 
               LastUsed = 0, 
               Pattern = key.Pattern, 
               Status = key.ApiKeyStatus, 
               Type = key.Type 
              }); 


      Reduce = results => from result in results 
           group result by result.ApiKeyId 
            into g 
            select new 
              { 
              AccountId = g.Select(x => x.AccountId).FirstOrDefault(), 
              ApiKeyId = g.Key, 
              Key = g.Select(x => x.Key).FirstOrDefault(x => x != null), 
              UsageCount = g.Sum(x => x.UsageCount), 
              LastUsed = g.Max(x => x.LastUsed), 
              Pattern = g.Select(x => x.Pattern).FirstOrDefault(), 
              Status = g.Select(x => x.Status).FirstOrDefault(), 
              Type = g.Select(x => x.Type).FirstOrDefault() 
              }; 
+0

似乎有一件事情是,group by應該是:group result by new {result.AccountId,result.ApiKeyId}。另外,爲什麼例如結果集中的模式?或狀態和類型? – eulerfx

+0

這些是目前的佔位符。我通過兩者分組獲得了什麼? – Steve

+0

這似乎是合乎邏輯的事情,雖然我不知道你的數據模型。我認爲實際的原因是ApiKey.ApplicationType.None是您的代碼中可用的靜態成員,但是當RavenDB進入索引時,它不會引用您的代碼庫並且不知道如何處理它。您只能在地圖中引用BCL類型並減少聲明。 – eulerfx

回答

2

的索引錯誤sequence contains no matching elements是的結果在空集合上調用First這就是爲什麼你應該使用FirstOrDefault。另外,在map和reduce聲明中引用自己的類會導致錯誤,因爲RavenDB無法在索引時解析這些類型。

+0

那麼爲什麼序列不包含任何元素?我把我的所有文件都映射到某種東西上,或者是模式唯一的罪魁禍首? – Steve

+0

它可能與RavenDB執行reduce的方式有關,它假定集合可能爲空。 – eulerfx