Pergunta

Suponha que eu tenho o modelo Foo no GAE e esta consulta:

.

query = Foo.all () fim ( '- tecla ')

Eu quero obter o registro n-th. Qual é a maneira mais eficiente para conseguir isso?

Será que a quebra de solução, se a propriedade de ordenação não é única, tal como a seguir:

.

query = Foo.all () fim ( '- Cor ')

edit: n> 1000

Editar 2: Eu quero desenvolver um mecanismo de paginação amigável que mostra páginas disponíveis (como página 1, página 2, ... Página 185) e requer um "? Page = x" na cadeia de consulta, em vez de um "? marcador = XXX". Quando page = x, a consulta é para buscar os registros começando do primeiro registro dessa página.

Foi útil?

Solução

Não há nenhuma maneira eficiente de fazer isso - em qualquer DBMS. Em todos os casos, você tem que pelo menos ler sequencialmente através dos registros de índice até encontrar o enésimo, em seguida, procurar o registro de dados correspondente. Isso é mais ou menos o que fetch (contagem, offset) faz no GAE, com a limitação adicional de 1000 registros.

Uma abordagem melhor para isso é manter um 'marcador', que consiste no valor do campo que você está requisitando em para a última entidade que recuperada, e uma chave da entidade. Então, quando você quer continuar de onde você parou, você pode adicionar o valor do campo como o limite inferior de uma consulta a desigualdade, e ignorar registros até igualar ou exceder a última vez que você viu.

Se você quiser fornecer compensações página 'amigável' para os usuários, o que você pode fazer é usar memcache para armazenar uma associação entre um deslocamento de início e um marcador (order_property, key) tupla. Quando você gerar uma página, inserir ou atualizar o marcador para a entidade após a última. Quando você buscar uma página, use o marcador se existir, ou gerá-lo da maneira mais difícil, fazendo consultas com offsets -. Potencialmente várias consultas, se o deslocamento é alta o suficiente

Outras dicas

Documentação para a classe de consulta pode ser encontrada em: http://code.google.com/appengine/docs/ python / datastore / queryclass.html # consulta

A classe de consulta fornece buscar bruxa tem um limite e um deslocamento no seu caso 1 e n

O tempo de execução do buscar cresce linearmente com o deslocamento + o limite

então a única maneira de otimizar no seu caso seria a de se certificar de que os registros que você deseja de acesso na maioria das vezes estão mais perto do início da matriz.

Você pode usar query.filter ( 'chave =', n) query.get ()

que retornaria a primeira partida com uma chave de n

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top