come ottenere l'n-esimo record di una query di archivio dati
-
05-07-2019 - |
Domanda
Supponi di avere il modello Foo in GAE e questa query:
query = Foo.all (). order ('- chiave ')
Voglio ottenere l'ennesimo record. Qual è il modo più efficiente per raggiungere questo obiettivo?
La soluzione si interromperà se la proprietà di ordinazione non è univoca, come quella seguente:
query = Foo.all (). order ('- color ')
modifica: n > 1000
modifica 2: desidero sviluppare un meccanismo di paging amichevole che mostri le pagine disponibili (come Pagina 1, Pagina 2, ... Pagina 185) e richieda una pagina "quot = x"; nella stringa di query, anziché un "? bookmark = XXX " ;. Quando page = x, la query è recuperare i record a partire dal primo record di quella pagina.
Soluzione
Non esiste un modo efficace per farlo - in nessun DBMS. In ogni caso, devi almeno leggere sequenzialmente i record dell'indice fino a trovare l'ennesimo, quindi cercare il record di dati corrispondente. Questo è più o meno ciò che fa il recupero (conteggio, offset) in GAE, con l'ulteriore limitazione di 1000 record.
Un approccio migliore a questo è quello di mantenere un 'segnalibro', costituito dal valore del campo su cui stai ordinando per l'ultima entità che hai recuperato e dalla chiave dell'entità. Quindi, quando si desidera continuare da dove si era interrotto, è possibile aggiungere il valore del campo come limite inferiore di una query di disuguaglianza e saltare i record fino a quando non si corrisponde o supera l'ultimo visualizzato.
Se si desidera fornire offset di pagina "amichevoli" agli utenti, è possibile utilizzare memcache per memorizzare un'associazione tra un offset iniziale e una tupla segnalibro (order_property, key). Quando si genera una pagina, inserire o aggiornare il segnalibro per l'entità successiva all'ultima. Quando recuperi una pagina, usa il segnalibro se esiste, o generalo nel modo più difficile, eseguendo query con offset - potenzialmente più query se l'offset è abbastanza alto.
Altri suggerimenti
La documentazione per la classe Query è disponibile all'indirizzo: http://code.google.com/appengine/docs/ python / datastore / queryclass.html # query
La classe di query fornisce il recupero di streghe richiede un limite e un offset nel tuo caso 1 e n
Il tempo di esecuzione del recupero aumenta linearmente con l'offset + il limite
quindi l'unico modo per ottimizzare nel tuo caso sarebbe quello di assicurarti che i record desiderati per accedere più spesso sono più vicini all'inizio dell'array.
Potresti usare query.filter ('key =', n) query.get ()
che restituirebbe la prima corrispondenza con una chiave di n