2012-05-04 2 views
3

ravenDB의 특정 시점보다 오래된 문서를 삭제하려고합니다. 나는 아직도 Lucene에 익숙하지 않고이 쿼리를 작성하는 데 어려움을 겪고있다.ravenDB에서 만료 날짜별로 일괄 처리 문서 삭제

 _Session.Advanced.DatabaseCommands.DeleteByIndex(
      typeof(AssetsByExpirationDate).Name, 
      new IndexQuery() 
      { 
       Query = string.Format("ExpirationDate:[\"{0:MM/dd/yyyy}\" TO \"{1:MM/dd/yyyy}\"]", DateTime.MinValue, new DateTime(2012,6,1)) 
      }); 

특정 날짜 이전에 항목을 삭제하는 쿼리의 올바른 구문은 무엇입니까?

+0

만료 번들을 사용하지 않는 이유는 무엇입니까? –

답변

5

당신은 DatabaseCommands IndexQuery 외부에서 쿼리를 작성하고 아래 IndexQuery 쿼리 문자열을 채우는 Query.ToString()를 사용할 수 있습니다 :이 방법을 사용하여

 var query = session.Advanced.LuceneQuery<Asset, AssetsByExpirationDate>() 
      .WhereBetween("ExpirationDate",DateTime.MinValue,new DateTime(2012, 6, 1)); 

     var queryString = query.ToString(); 

     session.Advanced.DatabaseCommands.DeleteByIndex(typeof(AssetsByExpirationDate).Name, new IndexQuery 
     { 
      Query = queryString 
     }); 

을 당신은 루씬 쿼리 구문에 익숙하지 않은 경우 RavenDb Query API는 앞에서와 같이 .ToString()을 호출하여이를 빌드하고 다음 Lucene 형식의 쿼리 문자열을 갖습니다.

ExpirationDate:{00010101000000000 TO 20120601000000000} 

DatabaseCommands를 사용하여 삭제하면 오래된 인덱스가 작동하지 않습니다. 조심하거나 표준 lucene 쿼리를 사용하여 삭제할 문서를 검색 한 다음 간단한 Session.Delete (asset) foreach 문서를 삭제하십시오. Ravendb 기본적로 128 결과를 반환 이후 매김에

 var query = session.Advanced.LuceneQuery<Asset, AssetsByExpirationDate>() 
      .WhereBetween("ExpirationDate",DateTime.MinValue,new DateTime(2012, 6, 1)); 
     var assets = query.ToList(); 

     foreach(var asset in assets) 
     { 
      session.Delete<Asset>(asset); 
     } 

     session.SaveChanges(); 

지불 관심.

+0

한 번에 30-40,000 개의 항목을 삭제합니다. 내 시나리오에서 인덱스를 사용하여 삭제하는 것이 가장 효율적인 방법입니다. 나는 색인이 부실하다고 너무 걱정하지 않는다. 나는 이것을 2 분마다 실행하여 나중에 색인이 쌓이지 않을 때 색인을 다시 칠 것이다. 감사합니다. LuceneQuery 기능에 대해 알지 못했습니다. –

+0

내장 RavenDB 기능을 사용하는 것이 약간 더 나은 방법입니다 (https://github.com/ayende/ravendb/blob/master/Raven.Abstractions/Linq/DateTools.cs 참조). –