como obter o registro de n-th de uma consulta do armazenamento de dados
-
05-07-2019 - |
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.
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