Datastore proporciona acceso mediante programación a algunos de sus metadatos para admitir la metaprogramación, implementar funciones administrativas de backend, simplificar el almacenamiento en caché coherente y otros fines similares. Por ejemplo, puedes usarlo para crear un visor de Datastore personalizado para tu aplicación. Los metadatos disponibles incluyen información sobre los grupos de entidades, los espacios de nombres, los tipos de entidades y las propiedades que usa tu aplicación, así como las representaciones de propiedades de cada propiedad.
El panel de control de Datastore de la consola Google Cloud también proporciona algunos metadatos sobre tu aplicación, pero los datos que se muestran allí difieren en algunos aspectos importantes de los que devuelven estas funciones.
- Actualización. Al leer los metadatos mediante la API, se obtienen los datos actuales, mientras que los datos del panel de control solo se actualizan una vez al día.
- Contenido. Algunos metadatos del panel de control no están disponibles a través de las APIs, y viceversa.
- Velocidad. Las operaciones de obtención y consulta de metadatos se facturan de la misma forma que las operaciones de obtención y consulta de Datastore. Las consultas de metadatos que obtienen información sobre espacios de nombres, tipos y propiedades suelen tardar en ejecutarse. Por lo general, una consulta de metadatos que devuelva N entidades tardará aproximadamente lo mismo que N consultas normales que devuelvan una sola entidad. Además, las consultas de representación de propiedades (consultas de propiedades que no son solo de claves) son más lentas que las consultas de propiedades que son solo de claves. Las obtenciones de metadatos de grupos de entidades son algo más rápidas que las de entidades normales.
Metadatos de grupos de entidades
Cloud Datastore proporciona acceso a la "versión" de un grupo de entidades, un número estrictamente positivo que aumenta en cada cambio del grupo de entidades.
Las versiones de grupos de entidades se obtienen llamando a get()
en una pseudoentidad especial
que contiene una propiedad __version__
estrictamente positiva. La clave de la seudoentidad se puede crear con el método Entities.createEntityGroupKey()
:
Comportamiento antiguo
En el comportamiento de la versión antigua del grupo de entidades, la versión del grupo de entidades solo aumenta cuando se producen cambios en el grupo de entidades. El comportamiento de los metadatos de grupos de entidades antiguos se puede usar, por ejemplo, para mantener una caché coherente de una consulta de ancestros compleja en un grupo de entidades.
En este ejemplo se almacenan en caché los resultados de una consulta (un recuento de los resultados coincidentes) y se usa el comportamiento antiguo de las versiones de grupos de entidades para usar el valor almacenado en caché si está actualizado:
Es posible que no existan entidades __entity_group__
para grupos de entidades en los que nunca se haya escrito.
consultas de metadatos
La clase Java
Entities
,
definida en el paquete
com.google.appengine.api.datastore
, proporciona tres tipos de entidades especiales que se reservan para las consultas de metadatos. Se denotan mediante constantes estáticas de la clase Entities
:
Constante estática | Tipo de entidad |
---|---|
Entities.NAMESPACE_METADATA_KIND |
__namespace__ |
Entities.KIND_METADATA_KIND |
__kind__ |
Entities.PROPERTY_METADATA_KIND |
__property__ |
Estos tipos no entrarán en conflicto con otros del mismo nombre que ya puedan existir en tu aplicación. Si consultas estos tipos especiales, puedes recuperar las entidades que contengan los metadatos que quieras.
Las entidades devueltas por las consultas de metadatos se generan de forma dinámica en función del estado actual de Datastore. Aunque puedes crear objetos locales Entity
de los tipos __namespace__
, __kind__
o __property__
, cualquier intento de almacenarlos en Datastore fallará y se mostrará un error IllegalArgumentException
.
La forma más sencilla de enviar consultas de metadatos es con la API Datastore de nivel inferior. En el siguiente ejemplo se imprimen los nombres de todos los espacios de nombres de una aplicación:
Consultas de espacio de nombres
Si tu aplicación usa la API Namespaces, puedes usar una consulta de espacio de nombres para encontrar todos los espacios de nombres que se usan en las entidades de la aplicación. Esto te permite realizar actividades como funciones administrativas en varios espacios de nombres.
Las consultas de espacios de nombres devuelven entidades del tipo especial __namespace__
cuya clave
name es el nombre de un espacio de nombres. (La excepción es el espacio de nombres predeterminado, designado por la cadena vacía ""
. Como la cadena vacía no es un nombre de clave válido, este espacio de nombres se identifica con el ID numérico 1
). Las consultas de este tipo solo admiten filtros de intervalos de la pseudopropiedad especial __key__
, cuyo valor es la clave de la entidad. Los resultados se pueden ordenar por el valor __key__
en orden ascendente (pero no descendente). Como las entidades __namespace__
no tienen propiedades, tanto las consultas de solo claves como las que no son de solo claves devuelven la misma información.
En el siguiente ejemplo se devuelve una lista de los espacios de nombres de una aplicación en el intervalo entre dos nombres especificados, start
y end
:
Consultas de tipo
Las consultas de tipo devuelven entidades de tipo __kind__
cuya clave es el nombre de un tipo de entidad. Las consultas de este tipo se restringen implícitamente al espacio de nombres actual y solo admiten filtros de intervalos de la pseudopropiedad __key__
. Los resultados se pueden ordenar de forma ascendente (pero no descendente) por el valor __key__
. Como las entidades __kind__
no tienen propiedades, las consultas que solo devuelven claves y las que no devuelven la misma información.
En el siguiente ejemplo se imprimen todos los tipos cuyos nombres empiezan por una letra minúscula:
Consultas de propiedades
Las consultas de propiedades devuelven entidades de tipo __property__
que denotan las propiedades asociadas a un tipo de entidad. La entidad que representa la propiedad P de tipo K se crea de la siguiente manera:
- La clave de la entidad tiene el tipo
__property__
y el nombre de clave P. - La clave de la entidad superior tiene el tipo
__kind__
y el nombre de clave K.
El comportamiento de una consulta de propiedad depende de si es una consulta solo de claves o una consulta que no es solo de claves (representación de propiedad), como se detalla en las subsecciones siguientes.
Consultas de propiedades: solo claves
Las consultas de propiedades solo con claves devuelven una clave por cada propiedad indexada de un tipo de entidad especificado. Las propiedades sin indexar no se incluyen. En el siguiente ejemplo se imprimen los nombres de todos los tipos de entidades de una aplicación y las propiedades asociadas a cada uno:
Las consultas de este tipo se restringen implícitamente al espacio de nombres actual y solo admiten filtros de intervalos de la pseudopropiedad __key__
, donde las claves denotan entidades __kind__
o __property__
. Los resultados se pueden ordenar por valor ascendente (pero no descendente) __key__
. El filtrado se aplica a los pares de tipo y propiedad, ordenados primero por tipo y, después, por propiedad. Por ejemplo, supongamos que tiene una entidad con estas propiedades:
- tipo
Account
con propiedadesbalance
company
- tipo
Employee
con propiedadesname
ssn
- tipo
Invoice
con propiedadesdate
amount
- tipo
Manager
con propiedadesname
title
- tipo
Product
con propiedadesdescription
price
La consulta para devolver los datos de la propiedad sería la siguiente:
La consulta anterior devolvería lo siguiente:
Employee: ssn
Invoice: date
Invoice: amount
Manager: name
Ten en cuenta que los resultados no incluyen la propiedad name
del tipo Employee
ni la propiedad title
del tipo Manager
, ni ninguna propiedad de los tipos Account
y Product
, porque están fuera del intervalo especificado en la consulta.
Las consultas de propiedades también admiten el filtrado de ancestros en una clave __kind__
o __property__
para limitar los resultados de la consulta a un solo tipo o propiedad. Por ejemplo, puedes usarlo para obtener las propiedades asociadas a un tipo de entidad determinado, como en el siguiente ejemplo:
Consultas de propiedades: no solo de claves (representación de la propiedad)
Las consultas de propiedades que no son solo de claves, conocidas como consultas de representación de propiedades, devuelven información adicional sobre las representaciones utilizadas por cada par de tipo y propiedad. Las propiedades sin indexar no se incluyen. La entidad devuelta para la propiedad P de tipo K tiene la misma clave que la de una consulta de solo claves correspondiente, así como una propiedad property_representation
adicional que devuelve las representaciones de la propiedad. El valor de esta propiedad es una instancia de la clase
java.util.Collection<String>
que contiene una cadena por cada representación de la propiedad P que se encuentra en cualquier entidad de tipo K.
Ten en cuenta que las representaciones no son lo mismo que las clases de propiedad. Varias clases de propiedad pueden asignarse a la misma representación. Por ejemplo, java.lang.String
y com.google.appengine.api.datastore.PhoneNumber
usan la representación STRING
.
En la siguiente tabla se muestra la asignación de clases de propiedad a sus representaciones:
Clase Property | Representación |
---|---|
java.lang.Byte |
INT64 |
java.lang.Short |
INT64 |
java.lang.Integer |
INT64 |
java.lang.Long |
INT64 |
java.lang.Float |
DOUBLE |
java.lang.Double |
DOUBLE |
java.lang.Boolean |
BOOLEAN |
java.lang.String |
STRING |
com.google.appengine.api.datastore.ShortBlob |
STRING |
java.util.Date |
INT64 |
com.google.appengine.api.datastore.GeoPt |
POINT |
com.google.appengine.api.datastore.PostalAddress |
STRING |
com.google.appengine.api.datastore.PhoneNumber |
STRING |
com.google.appengine.api.datastore.Email |
STRING |
com.google.appengine.api.users.User |
USER |
com.google.appengine.api.datastore.IMHandle |
STRING |
com.google.appengine.api.datastore.Link |
STRING |
com.google.appengine.api.datastore.Category |
STRING |
com.google.appengine.api.datastore.Rating |
INT64 |
com.google.appengine.api.datastore.Key |
REFERENCE |
com.google.appengine.api.blobstore.BlobKey |
STRING |
java.util.Collection<T> |
Representación de T |
En el siguiente ejemplo se buscan todas las representaciones de una propiedad especificada de un tipo de entidad determinado: