gpt4 book ai didi

mapreduce - RavenDB 索引与映射减少不同

转载 作者:行者123 更新时间:2023-12-02 22:26:54 24 4
gpt4 key购买 nike

我有一个稍微复杂的索引,需要在 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)
};

现在不会引发任何错误,但也不会给出任何结果。

最佳答案

大概应该是这样的:

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

但是你想要的并不需要 map 缩减索引。您只需使用即可获得:

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

您的 Map/Reduce 索引不起作用的原因是您的 Map 和 Reduce 函数有不同的输出。

关于mapreduce - RavenDB 索引与映射减少不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7258189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com