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, 3になり2, 3, 4 except 1, 2, 3ます4(これが を使用する理由ですCount() == 1。ただし、シーケンスに穴がある場合、カウントは 1 よりも大きくなります)となり、結果から除外した。

于 2012-08-29T11:18:06.547 に答える