2016-10-19 9 views
0

SQLワールドでこれを行う方法はわかっていますが、これをRavenDBの土地で把握しようとしています。RavenDBマルチマップインデックス - 両方のコレクションにないドキュメント

私のような2つのクラスがあります:私はに実行しているしわがないすべてのクライアントが待機リストにあることである

AddMap<Client>(clients => from c in clients select new { Id = (string)null, ClientId = c.ClientId, Name = c.Name }); 

AddMap<WaitingListEntry>(wls => from wl in wls select new { Id = wl.Id, ClientId = wl.ClientId, Name = (string)null }); 

Reduce = results => from result in results 
    group result by result.ClientId 
    into g 
    select new { Id = g.Select(x => x.Id).Where(x => x != null).First(), 
    ClientId = g.Key, 
    Name = g.Select(x => x.Name).Where(x => x != null).First() 
    }; 

public class Client 
{ 
    public string Id {get;set;} 
    public string Name {get;set;} 
} 

public class WaitingListEntry 
{ 
    public string Id {get;set;} 
    public string ClientId {get;set;} 
    public string OtherDocumentInformation {get;set;} 
} 

そしてかなり単純マップ/削減を私はインデックスからそれらを除外したいと思います。私はSQLの思考に慣れており、これを達成するためにここで何をすべきかを理解することはできません。

答えて

1

multimap indexを作成する必要はありません。 Indexを使用すると、クライアントとのすべてのあなたの順番待ちをゲットすることができ下回っ:

Index

そして、あなたは結果を得るでしょう:

enter image description here

私は、このデータを使用しました:

session.Store(new Client() { Id = "client/1", Name = "Client 1" }); 
session.Store(new Client() { Id = "client/2", Name = "Client 2" }); 
session.Store(new Client() { Id = "client/3", Name = "Client 3" }); 

session.Store(new WaitingListEntry() { Id = "waitingListEntry/1", ClientId = "client/1", OtherDocumentInformation = "Info" }); 
session.Store(new WaitingListEntry() { Id = "waitingListEntry/2", ClientId = "client/2", OtherDocumentInformation = "Info" }); 

session.SaveChanges(); 
+0

ああ私はばかだ。私は私の変圧器の中でLoadDocumentをやっていましたが、私はMapでもそれをやることはできませんでした。ありがとう! – Jonas

+1

LoadDocumentを使用して関連するドキュメントをインデックスすることはできますが、代わりにmap/reduceインデックスを作成することをお勧めします。たとえば、「LoadDocumentを使用すると、ロードされたドキュメントが追跡リストに追加されます。これにより、特に複数のドキュメントが同じドキュメントを追跡しているときに、非常に高価な計算が発生する可能性があります。 –

関連する問題