En esta página se describen las restricciones para consultar Datastore desde Google App Engine. A continuación, se indican las restricciones habituales que encontrarás al desarrollar para Datastore.
Las entidades que no tengan una propiedad con el nombre indicado en la consulta se ignorarán
No es necesario que las entidades del mismo tipo tengan las mismas propiedades. Para poder ser un resultado de una consulta, una entidad debe tener un valor (que puede ser nulo) para cada propiedad cuyo nombre se haya indicado en los filtros y los criterios de ordenación de la consulta. Si no es así, la entidad se omite de los índices utilizados para ejecutar la consulta y, por lo tanto, no se incluirá en los resultados de la consulta.
Filtrar por propiedades sin indexar no devuelve ningún resultado
Una consulta no puede encontrar valores de propiedades que no estén indexados ni ordenar por esas propiedades.
Los filtros de desigualdad se limitan a una propiedad como máximo
Para no tener que analizar todo el índice, el mecanismo de consulta se basa en que todos los resultados posibles de una consulta estén adyacentes entre sí en el índice. Para cumplir esta restricción, una sola consulta no puede usar comparaciones de desigualdad (<
, <=
, >
, >=
) en más de una propiedad en todos sus filtros. Por ejemplo, la siguiente consulta es válida porque ambos filtros de desigualdad se aplican a la misma propiedad:
Sin embargo, esta consulta no es válida porque usa filtros de desigualdad en dos propiedades diferentes:
Ten en cuenta que una consulta puede combinar filtros de igualdad (=
) para diferentes propiedades, junto con uno o varios filtros de desigualdad en una sola propiedad. Por lo tanto, la siguiente consulta es válida:
El orden de los resultados de la consulta no está definido cuando no se especifica ningún orden
Cuando una consulta no especifica un orden, los resultados se devuelven en el orden en el que se recuperan. A medida que evoluciona la implementación de Datastore (o si cambian los índices de una aplicación), este orden puede cambiar. Por lo tanto, si tu aplicación necesita que los resultados de la consulta se muestren en un orden concreto, asegúrate de especificarlo explícitamente en la consulta.
Los criterios de ordenación no se tienen en cuenta en las propiedades con filtros de igualdad
Las consultas que incluyen un filtro de igualdad para una propiedad determinada ignoran cualquier orden especificado para esa propiedad. Se trata de una optimización sencilla para evitar un procesamiento innecesario de las propiedades de un solo valor, ya que todos los resultados tienen el mismo valor para la propiedad y, por lo tanto, no es necesario ordenarlos más. Sin embargo, las propiedades con varios valores pueden tener valores adicionales además del que coincide con el filtro de igualdad. Dado que este caso práctico es poco habitual y aplicar el orden de clasificación sería costoso y requeriría índices adicionales, el planificador de consultas de Datastore simplemente ignora el orden de clasificación, incluso en el caso de valores múltiples. Esto puede provocar que los resultados de las consultas se devuelvan en un orden diferente al que parece implicar el orden de clasificación.
Las propiedades usadas en filtros de desigualdad deben ordenarse primero
Para obtener todos los resultados que coinciden con un filtro de desigualdad, una consulta analiza el índice para buscar la primera fila que coincida con el filtro y, a continuación, analiza hacia delante hasta que encuentra una fila que no coincide. Para que las filas consecutivas abarquen el conjunto de resultados completo, deben ordenarse por la propiedad utilizada en el filtro de desigualdad antes que por cualquier otra propiedad. Por lo tanto, si una consulta especifica uno o varios filtros de desigualdad junto con uno o varios criterios de ordenación, el primer criterio de ordenación debe hacer referencia a la misma propiedad que se indica en los filtros de desigualdad. La siguiente consulta es válida:
Esta consulta no es válida porque no ordena por la propiedad usada en el filtro de desigualdad:
Del mismo modo, esta consulta no es válida porque la propiedad utilizada en el filtro de desigualdad no es la primera que se ordena:
Las propiedades con varios valores pueden comportarse de formas sorprendentes
Debido a la forma en que se indexan, las entidades con varios valores para la misma propiedad a veces pueden interactuar con los filtros de consulta y los criterios de ordenación de formas inesperadas y sorprendentes.
Si una consulta tiene varios filtros de desigualdad en una propiedad determinada, una entidad coincidirá con la consulta solo si al menos uno de sus valores individuales de la propiedad cumple todos los filtros. Por ejemplo, si una entidad de tipo Widget
tiene los valores 1
y 2
para la propiedad x
, no coincidirá con la consulta:
Cada uno de los valores de x
de la entidad cumple uno de los filtros, pero ninguno de los valores cumple ambos. Ten en cuenta que esto no se aplica a los filtros de igualdad. Por ejemplo, la misma entidad cumplirá la consulta
aunque ninguno de los valores x
individuales de la entidad cumpla ambas condiciones del filtro.
Del mismo modo, el orden de clasificación de las propiedades con varios valores es inusual. Como estas propiedades aparecen una vez en el índice por cada valor único, el primer valor que se ve en el índice determina el orden de clasificación de una entidad:
- Si los resultados de la consulta se ordenan de forma ascendente, se utiliza el valor más pequeño de la propiedad para ordenarlos.
- Si los resultados se ordenan de forma descendente, se usa el valor más alto para ordenarlos.
- Los otros valores no afectan a los criterios de ordenación, ni tampoco la cantidad de valores.
Esto tiene la consecuencia inusual de que una entidad con los valores de propiedad 1
y 9
precede a una con los valores 4
, 5
, 6
y 7
tanto en orden ascendente como descendente.
Las consultas dentro de transacciones deben incluir filtros de ancestros
Las transacciones de Datastore solo operan en entidades que pertenecen al mismo grupo de entidades (descendientes de un ancestro común). Para mantener esta restricción, todas las consultas realizadas en una transacción deben incluir un filtro de ancestro que especifique un ancestro en el mismo grupo de entidades que las demás operaciones de la transacción.