使用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"one_answers"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
            };
    }
}

带查询:

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

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

最新更新