我在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; }
}
Run Code Online (Sandbox Code Playgroud)
我需要获得给定的所有产品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
};
Run Code Online (Sandbox Code Playgroud)
我应该得到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,
};
Run Code Online (Sandbox Code Playgroud)
但它在运行时不起作用,我得到了一个 AbstractIndexingExecuter||8||Failed to index documents for index (my index name)
我在一个单独的项目中重新创建了这个示例,我可以在Raven Studio的统计信息中看到我收到错误:
无法将类型'System.DateTimeOffset'隐式转换为'int'更改
DateTime?为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)
};
Run Code Online (Sandbox Code Playgroud)
现在没有错误,但它也没有给出任何结果.
它应该是这样的:
PricingDate = price.Max(p => (DateTimeOffset)price.Key.PricingDate)
Run Code Online (Sandbox Code Playgroud)
但是你想要的并不需要map reduce索引.你可以通过使用:
session.Query<PriceDocument>()
.Where(x=>x.ProduceId == prodId)
.OrderByDescending(x=>x.PriceDate)
.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
Map/Reduce索引不起作用的原因是map和reduce函数有不同的输出.
| 归档时间: |
|
| 查看次数: |
1879 次 |
| 最近记录: |