我在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 }
我正在尝试创建一个可以给我的索引:
我该怎么做?
答案 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
之外的所有version
,1, 2, 3
原始序列2, 3, 4 except 1, 2, 3
将为4
,这样我Count() == 1
1}}(这就是我使用{{1}}的原因。但是如果序列中有一个洞,则计数将大于1,因此从结果中排除。