我有一个集合,我需要确定一个总的运行总和值。该文件看起来像这样(大规模简化和无限制):
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索引,尝试将值细分为多个组,按CompanyId
和CustomerId
分组。我有兴趣从每个小组中获取最新的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,还有其他方法吗?现在我只是使用流式传输来手动计算客户端上的记录并且工作正常,但我想确保没有替代方案。答案 0 :(得分:2)