我在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,因此从结果中排除。