2010-06-11 15 views
13

Soy consciente de que el motor de aplicación tiene la restricción de la "desigualdad filtros están permitidos en una propiedad Sólo" tal como se describe aquí: http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html#Introducing_Indexescómo ejecutar efectivamente dos filtros de desigualdad en las consultas en el motor de aplicación

Sin embargo ¿hay alguna manera esencialmente ejecutar dos filtros, ¿o simplemente no es posible? Por ejemplo, si tuviera un tipo de entidad que simplemente tuviera una coordenada X e Y, y quisiera todas las entidades que están dentro de un cierto rango de X1 a X2 e Y1 a Y2, ¿hay alguna forma de consultar todas las entidades desde X1 hasta X2 ordenados por sus valores Y y luego tomar fácilmente los relevantes entre mi rango deseado para los valores Y?

Si es así, ¿alguien tiene algún código de ejemplo para demostrar?

Respuesta

6

Si se adapta a sus datos, puede discretizar su X e Y en contenedores, generar un hash de los dos valores y almacenar eso en el modelo. Luego puede hacer búsquedas exactas para los hash (es) que se superponen a la región en la que desea buscar. Luego, filtra manualmente los resultados que están fuera de tu región.

Esto es esencialmente lo que geomodel está haciendo por la latitud/longitud.

+0

¿hay una muestra de trabajo para este modelo? Al igual que necesito obtener resultados de edad> 26 y altura> 113. ¿Cómo lo mapearía/consultaría? – nanospeck

+0

Además de la edad, tal vez podría almacenar 'década' para cada usuario, como 0, 10, 20, 30, 40, etc. Luego haga una consulta donde la altura> 113 y la edad en [20, 30, 40, (y así en hasta decir 100)]. Luego, una vez que obtienes los resultados, filtra manualmente los que tienen menos de 26. –

3

Según la reciente Google I/O talk de Alfred Fuller, están trabajando en la compatibilidad con filtros de desigualdad múltiples en propiedades numéricas.

+2

¿Alguien sabe si esto ya pasó? – clifgray

+1

Solo en la consulta del objeto. De esta manera: SomeModel.all(). Filter ('a>', b) .filter ('a2>', b2) –

1

Dependiendo de lo que esté tratando de hacer, puede encontrar este MultiInequalityMixin interesante. Hace más o menos lo que describes, pasando la primera desigualdad a la base de datos de Google y haciendo las desigualdades subsiguientes como filtros. Descargo de responsabilidad: es una implementación bastante incompleta de una idea que tuve hace más de un año y no todos terminaron ...

Si necesita indexación eficiente en dos ejes, entonces como dice Saxon Druce, algún tipo de geohash Algoritmo de etc. es lo que se necesita.

Cuestiones relacionadas