Mapreduce 使用RavenDb索引查找完整序列
我在RavenDb中有一些文档,可能看起来像这样:Mapreduce 使用RavenDb索引查找完整序列,mapreduce,ravendb,Mapreduce,Ravendb,我在RavenDb中有一些文档,可能看起来像这样: { "Id": "obj/1", "Version": 1 }, { "Id": "obj/1", "Version": 2 }, { "Id": "obj/1", "Version": 3 }, { "Id": "obj/1", "Version": 4 }, { "Id": "obj/2", "Version": 1 }, { "Id": "obj/2", "Version": 2 }, { "Id": "obj/2", "Version"
{ "Id": "obj/1", "Version": 1 },
{ "Id": "obj/1", "Version": 2 },
{ "Id": "obj/1", "Version": 3 },
{ "Id": "obj/1", "Version": 4 },
{ "Id": "obj/2", "Version": 1 },
{ "Id": "obj/2", "Version": 2 },
{ "Id": "obj/2", "Version": 3 },
{ "Id": "obj/3", "Version": 1 },
{ "Id": "obj/3", "Version": 3 }
我正在尝试创建一个索引,它将为我提供:
- 序列“obj/1”和“obj/2”优选地按Id分组
- 不是“obj/3”序列,因为它尚未完成
我该怎么做呢?我设法解决了这个问题。我不确定这是否是最佳解决方案,但它似乎有效
class SequenceIndex : AbstractIndexCreationTask<MyObject>
{
public EventSequenceIndex()
{
Map = objects => from d in docs
orderby d.Version
select new
{
Id = d.Id,
Version = d.Version
};
TransformResults = (database, results) =>
from result in results
group result by result.Id into g
where g.Select(d => d.Version + 1)
.Except(g.Select(d => d.Version))
.Count() == 1
select new
{
Id = g.Key,
Objects = g
};
}
}
class SequenceIndex:AbstractIndexCreationTask
{
公共事件序列索引()
{
Map=objects=>来自文档中的d
orderby d.版本
选择新的
{
Id=d.Id,
版本=d.版本
};
TransformResults=(数据库、结果)=>
从结果到结果
按result.Id将结果分组到g中
其中g.Select(d=>d.Version+1)
.除了(g.Select(d=>d.Version))
.Count()==1
选择新的
{
Id=g.键,
对象=g
};
}
}
带查询:
var events = session.Query<MyObject, SequenceIndex>()
.As<MySequenceObjectView>()
.ToArray();
var events=session.Query()
.As()
.ToArray();
我按Id对文档进行分组,然后获取所有
version+1
,除了所有version
,对于1,2,3
的原始序列,除了1,2,3,它将是2,3,4,这给了我4
(这就是为什么我使用计数()==1
。但如果序列中存在漏洞,则计数将大于1,因此将从结果中排除。如何定义完整的序列?是否有顺序ID?1、2、3已完成,而1、3有漏洞且不完整。版本是顺序计数器。这将在事件处理器中使用。我将执行事件序列变得完整。我正在添加一个简单的读取模型。