I cursori di query consentono a un'applicazione di recuperare i risultati di una query in batch convenienti e sono consigliati rispetto all'utilizzo di offset interi per la paginazione. Per ulteriori informazioni sulla strutturazione delle query per la tua app, consulta la pagina Query.
Cursori di query
I cursori di query consentono a un'applicazione di recuperare i risultati di una query in batch convenienti senza incorrere nell'overhead di un offset di query. Dopo aver eseguito un'
operazione di recupero, l'applicazione può ottenere un
cursore, ovvero una stringa opaca con codifica base64 che contrassegna la posizione dell'indice di
l'ultimo risultato recuperato. L'applicazione può salvare questa stringa, ad esempio in Datastore, in Memcache, nel payload di un'attività della coda delle attività o incorporata in una pagina web come parametro HTTP GET o POST, e può quindi utilizzare il cursore come punto di partenza per un'operazione di recupero successiva per ottenere il batch successivo di risultati dal punto in cui è terminato il recupero precedente. Un recupero può anche specificare un cursore finale per limitare l'estensione del set di risultati restituito.
Offset rispetto ai cursori
Sebbene Datastore supporti gli offset interi, ti consigliamo di evitarli. Utilizza invece i cursori. L'utilizzo di un offset evita solo di restituire le entità saltate all'applicazione, ma queste entità vengono comunque recuperate internamente. Le entità saltate influiscono sulla latenza della query e all'applicazione vengono addebitate le operazioni di lettura necessarie per recuperarle. L'utilizzo dei cursori anziché degli offset consente di evitare tutti questi costi.
Esempio di cursore di query
In Go, un'applicazione ottiene un cursore dopo aver recuperato i risultati della query chiamando
il valore Iterator's Cursor metodo. Per recuperare
risultati aggiuntivi dal punto del cursore, l'applicazione prepara una
query simile con lo stesso tipo di entità, filtri e
ordini di ordinamento e passa il cursore al metodo
Start della query prima di eseguire il recupero:
Limitazioni dei cursori
I cursori sono soggetti alle seguenti limitazioni:
- Un cursore può essere utilizzato solo dalla stessa applicazione che ha eseguito la query originale e solo per continuare la stessa query. Per utilizzare il cursore in un'operazione di recupero successiva, devi ricostituire esattamente la query originale, inclusi lo stesso tipo di entità, il filtro predecessore, i filtri delle proprietà e gli ordinamenti. Non è possibile recuperare i risultati utilizzando un cursore senza configurare la stessa query da cui è stato generato originariamente.
- I cursori non funzionano sempre come previsto con una query che utilizza un filtro di disuguaglianza o un ordine di ordinamento su una proprietà con più valori. La logica di deduplicazione per queste proprietà a più valori non persiste tra i recuperi, il che potrebbe causare la restituzione dello stesso risultato più di una volta.
- Le nuove release di App Engine potrebbero modificare i dettagli di implementazione interni, invalidando i cursori che dipendono da essi. Se un'applicazione tenta di utilizzare un cursore non più valido, Datastore restituisce.
Cursori e aggiornamenti dei dati
La posizione del cursore è definita come la posizione nell'elenco dei risultati dopo l'ultimo risultato restituito. Un cursore non è una posizione relativa nell'elenco (non è un offset), ma un indicatore a cui Datastore può passare quando avvia una scansione dell'indice per i risultati. Se i risultati di una query cambiano tra gli utilizzi di un cursore, la query rileva solo le modifiche che si verificano nei risultati dopo il cursore. Se un nuovo risultato viene visualizzato prima della posizione del cursore per la query, non verrà restituito quando vengono recuperati i risultati dopo il cursore. Allo stesso modo, se un'entità non è più un risultato per una query, ma era apparsa prima del cursore, i risultati che vengono visualizzati dopo il cursore non cambiano. Se l'ultimo risultato restituito viene rimosso dal set di risultati, il cursore sa comunque come individuare il risultato successivo.
Quando recuperi i risultati della query, puoi utilizzare sia un cursore iniziale sia un cursore finale per restituire un gruppo continuo di risultati da Datastore. Quando utilizzi un cursore iniziale e un cursore finale per recuperare i risultati, non è garantito che le dimensioni dei risultati siano le stesse di quando hai generato i cursori. Le entità possono essere aggiunte o eliminate da Datastore tra il momento in cui vengono generati i cursori e il momento in cui vengono utilizzati in una query.
Passaggi successivi
- Scopri come specificare cosa restituisce una query e controllare ulteriormente i risultati della query.
- Scopri le limitazioni comuni per le query su Datastore.
- Scopri la coerenza dei dati e come funziona la coerenza dei dati con i diversi tipi di query su Datastore.
- Scopri la sintassi e la struttura di base delle query per Datastore.