Mapreduce 使用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"

我在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": 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有漏洞且不完整。版本是顺序计数器。这将在事件处理器中使用。我将执行事件序列变得完整。我正在添加一个简单的读取模型。