2010-06-11 14 views
13

Sono consapevole del fatto che il motore applicazione ha la limitazione di "Filtri disuguaglianza sono ammessi su una proprietà Solo", come descritto qui: http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html#Introducing_Indexescome eseguire in modo efficace due filtri di disuguaglianza sulle query nel motore di app

è Tuttavia c'è un modo eseguire essenzialmente due filtri, o semplicemente non è possibile? Ad esempio, se avessi un tipo di entità che aveva semplicemente una coordinata X e Y, e volevo tutte le entità che si trovano entro un certo intervallo da X1 a X2 e da Y1 a Y2, c'è un modo per interrogare tutte le entità da X1 a X2 ordinati per i loro valori Y e quindi facilmente afferrare quelli rilevanti tra il mio intervallo desiderato per i valori Y?

Se sì, qualcuno ha qualche codice di esempio da dimostrare?

risposta

6

Se si adatta ai dati, è possibile discretizzare X e Y in contenitori, generare un hash dei due valori e memorizzarli sul modello. Quindi puoi eseguire ricerche esatte per gli hash che si sovrappongono alla regione in cui vuoi effettuare la ricerca. Quindi, filtra manualmente i risultati che si trovano fuori dalla tua regione.

Questo è essenzialmente ciò che sta facendo geomodel per latitudine/longitudine.

+0

Esiste un esempio funzionante per questo modello? Come ho bisogno di ottenere risultati di età> 26 e altezza> 113. Come dovrei mappare/interrogarlo? – nanospeck

+0

Oltre all'età, è possibile memorizzare "decennio" per ogni utente, ad esempio 0, 10, 20, 30, 40, ecc. Quindi eseguire una query in cui altezza> 113 e età in [20, 30, 40, (e così via su a dire 100)]. Quindi, una volta ottenuti i risultati, filtrare manualmente quelli che sono meno di 26. –

3

Secondo il recente Google I/O talk di Alfred Fuller, stanno lavorando sul supporto per più filtri di disuguaglianza su proprietà numeriche.

+2

qualcuno sa se questo è già successo? – clifgray

+1

Solo nella query dell'oggetto. In questo modo: SomeModel.all(). Filter ('a>', b) .filter ('a2>', b2) –

1

A seconda di cosa si sta tentando di fare, è possibile trovare questo MultiInequalityMixin interessante. Fa praticamente quello che descrivi, passando la prima disuguaglianza attraverso il database di Google e facendo disuguaglianze successive come filtri. Disclaimer: è un'implementazione piuttosto schematica di un'idea che avevo più di un anno fa e non ho ancora finito ...

Se hai bisogno di indicizzazione efficiente su due assi, come dice Saxon Druce, una sorta di geohash l'algoritmo etc è ciò che è richiesto.

Problemi correlati