0

我在 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”,因为它还没有完成

我该怎么做?

4

1 回答 1

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 对文档进行分组,然后取除 allversion + 1之外的所有文件version,对于1, 2, 3will的原始序列2, 3, 4 except 1, 2, 3,这给了我4(这就是我使用Count() == 1. 但如果序列中有洞,则计数将大于 1 ,因此从结果中排除。

于 2012-08-29T11:18:06.547 回答