2016-10-19 1 views
0

SQL 세계에서이 작업을 수행하는 방법을 알고 있지만 RavenDB에서이 문제를 파악하려고합니다.RavenDB Multimap index - 두 컬렉션에 모두 포함되지 않은 문서

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;} 
} 

그리고 매우 간단지도/감소 :

나는 등이 개 수업을

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() 
    }; 

내가 실행 해요 주름은 모든 클라이언트가 대기 목록에 있다는 것입니다 , 나는 색인에서 그들을 제외하고 싶다. 나는 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를 사용하여 관련 문서를 인덱싱 할 수 있지만 대신 맵/축소 인덱스를 만드는 것이 좋습니다. 예를 들어, "LoadDocument를 사용하면로드 된 문서가 추적 목록에 추가되므로, 특히 여러 문서가 동일한 문서를 추적하는 경우 매우 비싼 계산이 발생할 수 있습니다." –

관련 문제