문제

나는 하나의 방법으로 할 수은 다음과 같다:

foo = db.GqlQuery("SELECT * FROM bar WHERE baz = 'baz')
my_count = foo.count()

내가 무엇을 좋아하지 않은 내 계산이 제한됩니다 max1000 내 쿼리 아마 속도가 느려질 수 있습니다.누군가 밖으로는 해결 방법?제가 마음에 하나이지만,그것을 느끼지 않는 깨끗합니다.는 경우에만 GQL 실수 기능...

도움이 되었습니까?

해결책

+1Jehiah 의 반응이다.

공식적인 축복받는 방법에 카운터 개체에 개입하여 구축 분할된 카운터.에도 불구하고 크게 소리 이름,이것은 매우 간단합니다.

다른 팁

당신은 뒤집어 생각할 때는 확장 가능한 데이터 저장소 같은 개를 당신의 계산을 합니다.이 경우에는 것을 의미를 유지할 필요가 카운터를 위한 각 baz 그리고 증가할 때마다 그들을 새로 추가 bar, 대신 계산시에 표시됩니다.

class CategoryCounter(db.Model):
    category = db.StringProperty()
    count = db.IntegerProperty(default=0)

그런 다음 경우를 만들기 바체,증가 카운터

def createNewBar(category_name):
  bar = Bar(...,baz=category_name)

  counter = CategoryCounter.filter('category =',category_name).get()
  if not counter:
    counter = CategoryCounter(category=category_name)
  else:
    counter.count += 1
  bar.put()
  counter.put()

db.run_in_transaction(createNewBar,'asdf')

지금 당신은 당신을 얻을 수있는 쉬운 방법 개수를 위한 특정 카테고리

CategoryCounter.filter('category =',category_name).get().count

계산 기능의 모든 데이터베이스는 느리다(예를들면,O(n))-이 GAE 데이터 저장소게는 더 명백하다.로 Jehiah 서 알 수 있듯이,저장해야 할 계산 개수에서 엔터티를 참조하는 경우에 당신이 원하는 확장성을 확보하십시오.

이지 않는 고유한 애플 리케이션 엔진-기타 데이터베이스는 그냥 숨기기 더 나은지,지금까지 어디에 당신이 계산하려고 수만 명의 기록이 각 요청마다,당신의 페이지를 렌더링하는 시간이 시작을 기하급수적으로 증가한...

에 따라 GqlQuery.count() 문서, 설정할 수 있습니다 limit 부 숫자보다 큰 1000:

from models import Troll
troll_count = Troll.all(keys_only=True).count(limit=31337)

분할된 카운터를 올바른 방법으로 추적을 유지의 숫자,이런 사람들은 말했다,하지만 당신이 그 이후 늦게 게임을(나)다음을 초기화를 해야에서 카운터를 실제 계산됩니다.하지만 이것은 훌륭한 레코딩 방법을 통해 귀하의 무료한 할당량의 데이터 저장소의 작은 작업(50,000 나는 생각한다).을 실행할 때마다 클릭하면 해당 코드를 사용하여 많은 작전으로 있는 모델 개체입니다.

나는 그것을 시도하지 않은,그리고 이것은 완전한 자원이지만 아마도 반복과 .fetch() 과 오프셋을 지정하는 것이 일하는가?

LIMIT=1000
def count(query):
   result = offset = 0
   gql_query = db.GqlQuery(query)
   while True:
     count = gql_query.fetch(LIMIT, offset)
     if count < LIMIT:
       return result
     result += count
     offset += LIMIT

orip 의 솔루션과 함께 약간의 조정:

LIMIT=1000
def count(query):
    result = offset = 0
    gql_query = db.GqlQuery(query)
    while True:
        count = len(gql_query.fetch(LIMIT, offset))
        result += count
        offset += LIMIT
        if count < LIMIT:
            return result

우리는 지금 데이터 저장소 통계하는 데 사용할 수 있는 쿼리를 엔터티를 계산할 수 있습니다.이러한 값을 가하지 않는 항상 가장 최근의 변경 내용으로 그들은 한 번 업데이트되는 모든 24-48 시간입니다.체크아웃 설명서(아래 링크 참조)더 많은 정보:

통계 데이터 저장소

로 지적 by@Dimu,통계 계산에 의해 구글에서는 정기적으로 괜찮은원할 때 정확한 계산이 필요하지 않고%의 레코드가 변경되지 않는 동안 크게 주어진 날입니다.

을 쿼리에 대한 통계는 특정 종류,다음을 사용할 수 있습니다 GQL 구조

select * from __Stat_Kind__ where kind_name = 'Person'

가 있는 속성의 반환에 의해 이 도움이되는:

  • count --수의 엔티티가 이런 종류의
  • bytes --전체 크기의 모든 요소 저장된 이러한 종류의
  • timestamp --는 날짜/시간는 경우에 대한 통계가 마지막으로 계산

예제 코드

에 응답하는 후속 질문으로 게시 설명을 내 대답이 나는 지금 일부를 제공하기 샘플 C# 는 코드를 사용하고,틀림없이 되지 않을 수 있습니다 견고한 그것이 있어야 하지만 보인 확인 작업에 대한 저:

/// <summary>Returns an *estimated* number of entities of a given kind</summary>
public static long GetEstimatedEntityCount(this DatastoreDb database, string kind)
{
    var query = new GqlQuery
    {
        QueryString = $"select * from __Stat_Kind__ where kind_name = '{kind}'",
        AllowLiterals = true
    };
    var result = database.RunQuery(query);
    return (long) (result?.Entities?[0]?["count"] ?? 0L);
}

최선의 해결 방법을 보일 수도 있는 작은 카운터-직관적이지만,그것은 위대한 작품에서 나의 모든 애플리케이션다.에 의존하기보다 정수 키와 개수()메소드를 추가 정수장하기 위해 자신의 데이터 형식.보일 수 있습니다 낭비 때까지 당신이 실제로 더 많은 1000 개 이상의 기록,그리고 당신은 갑자기는 것을 발견 fetch()및 제한()작동하지 않거 1000 기록을 경계가 있습니다.

def MyObj(db.Model):
  num = db.IntegerProperty()

면 새로운 객체를 만들어,당신은 당신 수동으로 검색해야 합 가장 높은 키:

max = MyObj.all().order('-num').get()
if max : max = max.num+1
else : max = 0
newObj = MyObj(num = max)
newObj.put()

이처럼 보일 수 있습 폐기물의 쿼리,만()반환하는 단일 기록 해제 상단의 인덱스입니다.그것은 매우 빠르다.

그런 다음,원할 때를 가져오는 과거에 1000 개체 제한,당신은 단순히:

MyObj.all().filter('num > ' , 2345).fetch(67)

나는 이미 수행을 읽을 때 아랄 발칸 반도의 통렬한 검토: http://aralbalkan.com/1504 .그것은 실망하지만,때 당신이 그것에 익숙해 당신은 얼마나 빠르게 이보다 카운트()에 관계 db,당신이 마음을 하지 않습니다...

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