2011-02-24 2 views
7

사람들이 우리 사이트에 들어올 수 있도록 로그인을 확인하기 위해 Raven을 사용하고 있습니다.Where()로 Raven을 쿼리하면 처음 128 개의 문서 만 필터링됩니까?

// Context is an IDocumentSession 
Context.Query<UserModels>() 
      .SingleOrDefault(u => u.Email.ToLower() == email.ToLower()); 

쿼리는 까마귀의 문서의 처음 128 개 문서에 필터 : 우리가 발견 한 무엇

는이 작업을 수행하는 경우이다. 데이터베이스에는 수천 개가 있습니다. 따라서 이메일이 처음으로 반환 된 경우가 아니라면 행운을 빕니다.

Raven 샘플 코드 또는 샘플 코드 중 Skip() 및 Take()를 사용하여 반복을 수행하지 않고 세트를 반복합니다.

  1. 이것은 Raven에서 원하는 동작입니까?
  2. 고급 Lucene 쿼리를 사용하더라도 동일한 동작입니까? 즉; 고급 쿼리는 다르게 동작합니까?
  3. 아래 해결 방법이 적절합니까? 좀 못 생겼어. : P

해결 방법 : 이 null이 아닌 값을 만나기 전까지는 모든 문서 세트를 반복하는 것이 해결책입니다.

public T SingleWithIndex(string indexName, Func<T, bool> where) 
{ 
    var pageIndex = 1; 
    const int pageSize = 1024; 
    RavenQueryStatistics stats; 

var queryResults = Context.Query<T>(indexName) 
    .Statistics(out stats) 
    .Customize(x => x.WaitForNonStaleResults()) 
    .Take(pageSize) 
    .Where(where).SingleOrDefault(); 

if (queryResults == null && stats.TotalResults > pageSize) 
{ 
    for (var i = 0; i < (stats.TotalResults/(pageIndex * pageSize)); i++) 
    { 
     queryResults = Context.Query<T>(indexName) 
      .Statistics(out stats) 
      .Customize(x => x.WaitForNonStaleResults()) 
      .Skip(pageIndex * pageSize) 
      .Take(pageSize) 
      .Where(where).SingleOrDefault(); 

     if (queryResults != null) break; 

     pageIndex++; 
    } 

} 

return queryResults; 

}

편집 : 아래의 수정을 사용하여

내 RavenDB 인스턴스에 검색어 매개 변수를 전달하지 않습니다. 왜 아직 확실하지 않습니다.

Context.Query<UserModels>() 
    .Where(u => u.Email == email) 
    .SingleOrDefault(); 

결국 linq 쿼리 대신 고급 Lucene 구문을 사용하고 모든 것이 예상대로 작동합니다.

답변

4

RavenDB는 SingleOrDefault을 인식하지 못하므로 필터없이 쿼리를 수행합니다. 그런 다음 조건이 결과 세트에서 실행되지만 기본 Raven 당 처음 128 개의 문서 만 반환됩니다. 대신, 당신은 너무 필터링이 RavenDB/루씬에 의해 이루어집니다

Context.Query<UserModels>() 
     .Where(u => u.Email == email) 
     .SingleOrDefault(); 

를 호출해야합니다.

+0

Google 그룹에 이것을 게시하고 Ayende는 SingleOrDefault()에서 술어를 아직 지원하지 않는다고 언급했습니다. 내 문제는 linq 쿼리가 내 서버에 쿼리 매개 변수를 전달하지 않는다는 것을 알게되었습니다. –

관련 문제