将Map / Reduce Index的结果输入另一个以进一步减少

时间:2016-02-20 05:37:55

标签: c# linq mapreduce ravendb

我有一个集合,我需要确定一个总的运行总和值。该文件看起来像这样(大规模简化和无限制):

public class Entry
{
    public string id {get;set;}
    public string CompanyId {get;set;}
    public string CustomerId {get;set;}
    public decimal PurchaseAmount {get;set;}
    public bool VoidAllEntries {get;set;}
    public DateTime CreatedOn {get;set;}
    // and many others that are irrelevant to this question
}

我制作了一个Map / Reduce索引,尝试将值细分为多个组,按CompanyIdCustomerId分组。我有兴趣从每个小组中获取最新的Entry(基于CreatedOn),然后将所有内容归结为PurchaseAmount的总数。我需要它以这种方式工作的原因是因为如果最新的Entry的{​​{1}}属性为真,我不需要计算总计中的VoidAllEntries。因此索引结果如下所示:

PurchaseAmount

我目前的Map / Reduce Index方法如下所示:

public class SummaryResult
{
    public string CompanyId {get;set;}
    public string CustomerId {get;set;}
    public decimal PurchaseAmount {get;set;}
    public bool VoidAllEntries {get;set;}
    public DateTime CreatedOn {get;set;}
} 

这实际上是分组和获得最新// Let's call it SummaryIndex Map = list => from val in list select new { val.CompanyId, val.CustomerId, val.VoidAllEntries, PurchaseAmount = val.VoidAllEntries ? 0 : val.PurchaseAmt + val.OtherCosts, val.CreatedOn }; Reduce = results => from r in results orderby r.CreatedOn group r by new { r.CompanyId, r.CustomerId } into g let latest = g.OrderByDescending(x => x.CreatedOn).First() select new { g.Key.CompanyId, g.Key.CustomerId, latest.VoidAllEntries, latest.CreatedOn, latest.PurchaseAmount }; 的一部分非常好。现在我面临的问题是我似乎无法弄清楚如何让RavenDB根据这些结果在服务器上进行第二次Map / Reduce操作。最后,我希望能够将其缩小到只有3个方面:

Entry

public class FinalResult { public string CompanyId {get;set;} public decimal PurchaseGrandTotal {get;set;} public decimal Count {get;set;} } PurchaseGrandTotal相当于我在客户端运行此功能:

Count

我想在服务器上执行此操作的原因是因为我可能正在处理大量数据,并且我不想在客户端上加载所有内容以处理这些摘要。我无法弄清楚我是否可以在C#中创建第二个Map / Reduce索引,它将SummaryIndex的结果作为输入。

有什么想法吗?我是以错误的方式解决这个问题吗?

编辑:我不得不改写这个问题,因为从技术上讲,Ayende的答案是正确的答案,正如我最初所说的那样。但是,我在凌晨2点发布,我想我没有正确解释我的问题。我不能使用脚本索引的原因是因为结果没有存储为文档(这是我引导Ayende相信的)。除了Scripted Indexes,还有其他方法吗?现在我只是使用流式传输来手动计算客户端上的记录并且工作正常,但我想确保没有替代方案。

1 个答案:

答案 0 :(得分:2)