문제

GAE에 모델 FOO가 있다고 가정 하고이 쿼리가 있다고 가정합니다.

query = foo.all (). Order ( '-열쇠')

N-th 레코드를 받고 싶습니다. 그것을 달성하는 가장 효율적인 방법은 무엇입니까?

주문 속성이 고유하지 않은 경우 다음과 같이 솔루션이 중단됩니다.

query = foo.all (). Order ( '-색깔')

편집 : n> 1000

편집 2 : 사용 가능한 페이지 (예 : 1 페이지, 2 페이지, ... 185 페이지)를 보여주는 친절한 페이징 메커니즘을 개발하고 "? 북마크 대신 쿼리 문자열에"? page = x "가 필요합니다. = xxx ". Page = X 인 경우 쿼리는 해당 페이지의 첫 번째 레코드에서 시작하는 레코드를 가져 오는 것입니다.

도움이 되었습니까?

해결책

이 작업을 수행하는 효율적인 방법은 없습니다. 모든 경우에, 당신은 nth를 찾을 때까지 인덱스 레코드를 순차적으로 읽은 다음 해당 데이터 레코드를 찾아야합니다. 이것은 GAE에서 페치 (카운트, 오프셋)가하는 일이며 1000 개의 레코드의 추가 제한이 있습니다.

이에 대한 더 나은 접근 방식은 검색 한 마지막 엔티티에 대해 주문한 필드의 가치와 엔터티의 키로 구성된 '북마크'를 유지하는 것입니다. 그런 다음 중단 된 곳에서 계속하려면 필드의 값을 불평등 쿼리의 하한으로 추가하고 마지막으로 본 마지막 쿼리를 일치 시키거나 초과 할 때까지 레코드를 건너 뛸 수 있습니다.

사용자에게 '친숙한'페이지 오프셋을 제공하려면 Memcache를 사용하여 시작 오프셋과 북마크 (Order_Property, Key) 튜플 사이의 연관성을 저장하는 것입니다. 페이지를 생성 할 때 마지막 페이지를 따르는 엔티티의 북마크를 삽입하거나 업데이트하십시오. 페이지를 가져 오면 페이지가 존재하는 경우 북마크를 사용하거나 오프셋으로 쿼리를 수행하여 책갈피를 생성하십시오. 오프셋이 충분히 높으면 잠재적으로 여러 쿼리를 수행하십시오.

다른 팁

쿼리 클래스에 대한 문서는 다음에서 찾을 수 있습니다.http://code.google.com/appengine/docs/python/datastore/queryclass.html#query

쿼리 클래스는 페치 마녀에게 제한을 받고 케이스 1 및 N의 오프셋을 제공합니다.

페치의 실행 시간은 오프셋 + 제한으로 선형으로 증가합니다.

따라서 귀하의 경우에 최적화하는 유일한 방법은 가장 자주 액세스하려는 레코드가 배열의 시작 부분에 더 가깝게 만드는 것입니다.

query.filter ( 'key =', n) query.get ()를 사용할 수 있습니다.

N 키로 첫 경기를 반환합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top