사람들이 우리 사이트에 들어올 수 있도록 로그인을 확인하기 위해 Raven을 사용하고 있습니다.Where()로 Raven을 쿼리하면 처음 128 개의 문서 만 필터링됩니까?
이// Context is an IDocumentSession
Context.Query<UserModels>()
.SingleOrDefault(u => u.Email.ToLower() == email.ToLower());
쿼리는 까마귀의 문서의 처음 128 개 문서에 필터 : 우리가 발견 한 무엇
는이 작업을 수행하는 경우이다. 데이터베이스에는 수천 개가 있습니다. 따라서 이메일이 처음으로 반환 된 경우가 아니라면 행운을 빕니다.
Raven 샘플 코드 또는 샘플 코드 중 Skip() 및 Take()를 사용하여 반복을 수행하지 않고 세트를 반복합니다.
- 이것은 Raven에서 원하는 동작입니까?
- 고급 Lucene 쿼리를 사용하더라도 동일한 동작입니까? 즉; 고급 쿼리는 다르게 동작합니까?
- 아래 해결 방법이 적절합니까? 좀 못 생겼어. : 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 구문을 사용하고 모든 것이 예상대로 작동합니다.
Google 그룹에 이것을 게시하고 Ayende는 SingleOrDefault()에서 술어를 아직 지원하지 않는다고 언급했습니다. 내 문제는 linq 쿼리가 내 서버에 쿼리 매개 변수를 전달하지 않는다는 것을 알게되었습니다. –