Firestore en modo Datastore (Datastore) admite una variedad de tipos de datos para valores de propiedad. Se incluyen, entre otros:
- Números enteros
- números de punto flotante
- Strings
- Fechas
- Datos binarios
Para obtener una lista completa de los tipos, consulta Tipos de valores y propiedades.
Tipos de valores y propiedades
Los valores de datos asociados con una entidad constan de una o más propiedades. Cada propiedad tiene un nombre y uno o más valores. Una propiedad puede tener valores de más de un tipo, y dos entidades pueden tener valores de diferentes tipos para la misma propiedad. Las propiedades pueden o no estar indexadas (las consultas que ordenan o filtran en una propiedad P ignorarán las entidades en las que P no esté indexada). Una entidad puede tener como máximo 20,000 propiedades indexadas.
Se admiten los tipos de valor siguientes:
Tipo de valor | Tipo(s) de Java | Orden | Notas |
---|---|---|---|
Número entero | short int long java.lang.Short java.lang.Integer java.lang.Long |
Numérico | Se almacena como un número entero largo y, luego, se convierte al tipo de campo Los valores fuera de rango se superponen |
Número de punto flotante | float double java.lang.Float java.lang.Double |
Numérico | Precisión doble de 64 bits, IEEE 754 |
Booleano | boolean java.lang.Boolean |
false <true |
|
String de texto (corta) | java.lang.String |
Unicode | Hasta 1,500 bytes Valores superiores a 1,500 bytes IllegalArgumentException |
String de texto (larga) | com.google.appengine.api.datastore.Text |
Ninguna | Hasta 1 megabyte Sin indexar |
String de bytes (corta) | com.google.appengine.api.datastore.ShortBlob |
Orden de bytes | Hasta 1,500 bytes Valores más largos que 1,500 bytes IllegalArgumentException |
String de bytes (larga) | com.google.appengine.api.datastore.Blob |
Ninguna | Hasta 1 megabyte Sin indexar |
Fecha y hora | java.util.Date |
Cronológico | |
Punto geográfico | com.google.appengine.api.datastore.GeoPt |
Por latitud, luego por longitud |
|
Dirección postal | com.google.appengine.api.datastore.PostalAddress |
Unicode | |
Número de teléfono | com.google.appengine.api.datastore.PhoneNumber |
Unicode | |
Dirección de correo electrónico | com.google.appengine.api.datastore.Email |
Unicode | |
Usuario de Cuentas de Google | com.google.appengine.api.users.User |
Dirección de correo electrónico en orden Unicode |
|
Controlador de mensajería instantánea | com.google.appengine.api.datastore.IMHandle |
Unicode | |
Vínculo | com.google.appengine.api.datastore.Link |
Unicode | |
Categoría | com.google.appengine.api.datastore.Category |
Unicode | |
Calificación | com.google.appengine.api.datastore.Rating |
Numérico | |
Clave de Datastore | com.google.appengine.api.datastore.Key o el objeto referenciado (como secundario) |
Por elementos de ruta de acceso (tipo, identificador, tipo, identificador…) |
Hasta 1,500 bytes Valores más largos que 1,500 bytes IllegalArgumentException |
Clave de Blobstore | com.google.appengine.api.blobstore.BlobKey |
Orden de bytes | |
Entidad incorporada | com.google.appengine.api.datastore.EmbeddedEntity |
Ninguna | No indexada |
Null | null |
Ninguna |
Importante: Se recomienda evitar almacenar users.User
como valor de propiedad porque incluye la dirección de correo electrónico junto con el ID único. Si un usuario cambia su dirección de correo electrónico y la comparas su user.User
anterior almacenado con el valor de user.User
nuevo, no coincidirán. En su lugar, usa el valor de ID del usuario User
como el identificador único estable del usuario.
Para strings de texto y datos binarios sin codificación (strings de bytes), Datastore es compatible con dos tipos de valores:
- Las strings cortas (hasta 1,500 bytes) se indexan y pueden usarse en condiciones de filtros de consultas y para ordenar elementos.
- Las strings largas (de hasta 1 megabyte) no se indexan ni pueden usarse en filtros de consultas ni para ordenar elementos.
Blob
en la API de Datastore. Este tipo no está relacionado con los BLOB, como se usa en la API de Blobstore.
Cuando una consulta incluye una propiedad con valores de varios tipos, Datastore usa un orden determinista basado en representaciones internas:
- Valores nulos
- Números de coma fija
- Números enteros
- Fechas y horas
- Calificaciones
- Valores booleanos
- Secuencias de bytes
- String de bytes
- String de Unicode
- Claves de Blobstore
- Números de coma flotante
- Puntos geográficos
- Usuarios de Cuentas de Google
- Claves de Datastore
Debido a que las strings de texto largas, las strings de bytes largas y las entidades incorporadas no se indexan, no tienen orden definido.
Propiedades repetidas
Puedes almacenar varios valores dentro de una sola propiedad.
Entidades incorporadas
A veces puede resultar práctico incorporar una entidad como una propiedad de otra entidad. Esto puede ser útil, por ejemplo, para crear una estructura jerárquica de valores de propiedad dentro de una entidad. La clase EmbeddedEntity
de Java te permite realizar las siguientes acciones:
Las propiedades de una entidad incorporada no se indexan y no se pueden usar en consultas. De forma opcional, puedes asociar una clave con una entidad incorporada, pero, a diferencia de una entidad completa, no es necesaria la clave y, aunque exista, no se puede usar para recuperar la entidad.
En lugar de propagar las propiedades de la entidad incorporada, puedes usar el método setPropertiesFrom()
para copiarlas desde una entidad existente:
Más adelante, puedes usar el mismo método para recuperar la entidad original de la entidad incorporada:
Usa una lista vacía
Históricamente, Datastore no tenía una representación para una propiedad que represente una lista vacía. El SDK de Java solucionó esto almacenando colecciones vacías como valores nulos, por lo que no hay manera de distinguir entre valores nulos y listas vacías. Para mantener la retrocompatibilidad, este sigue siendo el comportamiento predeterminado, que se resume de la siguiente manera:
- Las propiedades nulas se escriben como nulas en Datastore.
- Las colecciones vacías se escriben como nulas en Datastore.
- Un nulo se lee como nulo desde Datastore.
- Una colección vacía se lee como nula.
Sin embargo, si modificas el comportamiento predeterminado, el SDK para Java de Appengine Datastore será compatible con el almacenamiento de listas vacías. Recomendamos que consideres las consecuencias de modificar el comportamiento predeterminado de tu aplicación y luego actives la asistencia para listas vacías.
Para cambiar el comportamiento predeterminado a fin de que puedas usar listas vacías, configura la propiedad DATASTORE_EMPTY_LIST_SUPPORT durante la inicialización de tu app, de la siguiente manera:
System.setProperty(DatastoreServiceConfig.DATASTORE_EMPTY_LIST_SUPPORT, Boolean.TRUE.toString());
Con esta propiedad configurada en true
como se muestra arriba, ocurre lo siguiente:
- Las propiedades nulas se escriben como nulas en Datastore.
- Las colecciones vacías se escriben como lista vacía en Datastore.
- Un nulo se lee como nulo desde Datastore.
- Cuando se lee desde Datastore, se muestra una lista vacía como una Colección vacía.