2017-02-10 1 views
0

내 프로젝트에서 문서가 삭제되는 것을 방지하고 메타 데이터를 사용하여 문서를 보관 됨으로 표시하기로 결정했습니다. 나는 그렇게 코드 아래 사용 : 나는 false로 설정 메타 데이터 값을 보관 된 문서만을 반환하는 쿼리를 변경하고 싶어 그 후RavenDB 메타 데이터 쿼리

public class DeleteDocumentListener : IDocumentDeleteListener 
{ 
    public void BeforeDelete(string key, object entityInstance, RavenJObject metadata) 
    { 
     metadata.Add("Archived", true); 
     throw new NotSupportedException(); 
    } 
} 

:

using (var session = _store.OpenSession()) 
{ 
    var query = session.Advanced.DocumentQuery<Cutter>() 
       .WhereEquals("@metadata.Archived", false); 
} 

불행하게도이 쿼리 반환 빈 결과 집합을. Document에이 메타 데이터 속성이 없으면 위의 조건은 false로 처리됩니다. 내가 기대했던 것이 아니었다.

메타 데이터 속성이 없거나이 속성에 값이있는 문서를 반환하도록 쿼리를 작성하려면 어떻게해야합니까?

답변

3

당신은 당신이 Cutter 문서에 대한 인덱스를 생성하여 해결하고 그 다음에 대해 조회 할 수 있습니다

public class ArchivedIndex : AbstractIndexCreationTask<Cutter> 
{ 
    public class QueryModel 
    { 
     public bool Archived { get; set; } 
    } 

    public ArchivedIndex() 
    { 
     Map = documents => from doc in documents 
      select new QueryModel 
      { 
       Archived = MetadataFor(doc)["Archived"] != null && MetadataFor(doc).Value<bool>("Archived") 
      }; 
    } 
} 

을 다음과 같이 그것을 조회 :이 도움이

using (var session = documentStore.OpenSession()) 
{ 
    var cutters = session.Query<ArchivedIndex.QueryModel, ArchivedIndex>() 
     .Where(x => x.Archived == false) 
     .OfType<Cutter>() 
     .ToList(); 
} 

희망을!

+0

매우 효과적입니다. 감사드립니다. 프로젝트에있는 각 엔티티에 대해 이러한 인덱스를 구현해야하는 것은 사실입니까? 하나의 범용 색인을 가질 수 있습니까? –