使用RavenDb索引查找完整序列

时间:2012-08-29 08:21:45

标签: 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": 3 },
{ "Id": "obj/3", "Version": 1 },
{ "Id": "obj/3", "Version": 3 }

我正在尝试创建一个可以给我的索引:

  • 序列“obj / 1”和“obj / 2”,优选地按Id分组。
  • 不是序列“obj / 3”,因为它尚未完成

我该怎么做?

1 个答案:

答案 0 :(得分:0)

我设法解决了这个问题。我不确定它是最佳解决方案,但似乎有效。

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
            };
    }
}

使用查询:

var events = session.Query<MyObject, SequenceIndex>()
    .As<MySequenceObjectView>()
    .ToArray();

我按照ID对文档进行分组,然后除了version + 1之外的所有version1, 2, 3原始序列2, 3, 4 except 1, 2, 3将为4,这样我Count() == 1 1}}(这就是我使用{{1}}的原因。但是如果序列中有一个洞,则计数将大于1,因此从结果中排除。