2011-08-31 24 views
4

我有一個稍微複雜的指標,我需要在給定的這個文件定義,就像一個RavenDB文件RavenDB指數地圖縮小不同

public class PriceDocument 
{ 
    public string Id { get; set; } 
    public Guid PriceId { get; set; } 
    public decimal Price { get; set; } 
    public DateTime? PricingDate { get; set; } 
    public string Source { get; set; } 
    public int Version { get; set; }  
} 

我需要讓所有的產品對於一個給定productId (我能做到這一點,當我查詢) 通過PricingDate(最新)和Source

所以給出的以下數據是唯一的:

var priceDocument = new PriceDocument { 
    Price = 1m, 
    Id = productId + "/1", 
    PricingDate = new DateTime(2011, 4, 1, 8, 0, 0), 
    PriceId = productId, 
    Source = "Bloomberg", 
    Version = 1 
}; 

var priceDocument1 = new PriceDocument { 
    Price = 1m, 
    Id = productId + "/2", 
    PricingDate = new DateTime(2011, 4, 1,9,0,0), 
    PriceId = productId, 
    Source = "Bloomberg", 
    Version = 1 
}; 

我應該得到的結果priceDocument1,因爲它的最新版本。

到目前爲止,我已經像這樣定義的索引:

Map = docs => 
    from priceDocument in docs 
    select new { 
     PricingDate = priceDocument.PricingDate, 
     PricingSource = priceDocument.Source, 
     Price = priceDocument.Price, 
     PriceId = priceDocument.PriceId 
    }; 

Reduce = results => 
    from result in results 
    group result by new { result.PricingDate, result.Source } into price 
    select new { 
     PricingDate = price.Max(p => price.Key.PricingDate), 
     PricingSource = price.Key.Source, 
    }; 

但它不運行時的工作,我發現了一個AbstractIndexingExecuter||8||Failed to index documents for index (my index name)

我在一個單獨的項目重新創建此示例和我可以看到,在Raven Studio的統計數據中,我得到以下錯誤:

Cannot implicitly convert type 'System.DateTimeOffset' to 'int' changed the DateTime? to DateTime

並且沒有運氣。

從使用之日起使用,我可以依靠它遞增所以現在的指數看起來是這樣的切換:

Map = docs => 
    from priceDocument in docs 
    select new { 
     PricingDate = priceDocument.PricingDate, 
     PricingSource = priceDocument.Source, 
     ProductId = priceDocument.ProductId, 
     ProductVersion = priceDocument.Version 
    }; 

Reduce = results => 
    from result in results 
    group result by new { 
     result.PriceId, 
     result.PricingDate, 
     result.Source, 
     result.Version 
    } into price 
    select new { 
     PricingDate = price.Key.PricingDate, 
     PricingSource = price.Key, 
     ProductVersion = price.Max(p=> price.Key.Version) 
    }; 

現在不引發錯誤,但它也沒有給出結果。

回答

5

它可能應該是這樣的:

PricingDate = price.Max(p => (DateTimeOffset)price.Key.PricingDate) 

但你想要的東西沒有按不需要地圖縮小索引。你可以通過只使用:

session.Query<PriceDocument>() 
     .Where(x=>x.ProduceId == prodId) 
     .OrderByDescending(x=>x.PriceDate) 
     .FirstOrDefault(); 

的原因,你的Map/Reduce指數不工作是,你必須對地圖&減少功能不同的輸出。

+0

嗨Ayende:感謝您的答案,事情是它必須是唯一的PriceDate和PricingSource(即我可以有2行與同日,只要來源是不同的),並選擇其中一個版本(或日期)是最高的 – roundcrisis

+0

然而,這wasnt全部答案,@ayende烏鴉討論組https://groups.google在回答這個問題。 com/d/topic/ravendb/B9HCmi32YWw /討論和解決方法在這裏https://gist.github.com/1186051 – roundcrisis

3

試圖改變指數的降低部分這條線,從

PricingDate = price.Max(p => price.Key.PricingDate) 

PricingDate = price.Max(p => (int)price.Key.PricingDate) 
+0

謝謝我已經嘗試過,現在結果是沒有錯誤,但沒有結果 – roundcrisis