Solo estoy explorando el nuevo Firebase Firestore y contiene un tipo de datos llamado reference
. No me queda claro qué hace esto.
- ¿Es como una clave foránea?
- ¿Se puede usar para apuntar a una colección que se encuentra en otro lugar?
- Si
reference
es una referencia real, ¿puedo usarla para consultas? Por ejemplo, ¿puedo tener una referencia que apunte directamente al usuario, en lugar de almacenar el ID de usuario en un campo de texto? ¿Y puedo usar esta referencia de usuario para realizar consultas?
firebase
google-cloud-firestore
Jürgen Brandstetter
fuente
fuente
Respuestas:
Las referencias son muy parecidas a las claves externas.
Los SDK publicados actualmente no pueden almacenar referencias a otros proyectos. Dentro de un proyecto, las referencias pueden apuntar a cualquier otro documento en cualquier otra colección.
Puede utilizar referencias en consultas como cualquier otro valor: para filtrar, ordenar y para paginación (startAt / startAfter).
A diferencia de las claves foráneas en una base de datos SQL, las referencias no son útiles para realizar uniones en una sola consulta. Puede usarlos para búsquedas dependientes (que parecen unidas), pero tenga cuidado porque cada salto dará como resultado otro viaje de ida y vuelta al servidor.
fuente
friends
colección con todos mis amigos (friends/myId
). Luego, hago referencia a este documento en elfriends
campo de otro documento (group/groupId
). Me gustaría mostrar sólo mis amigos que están en ese grupo, haciendo algo como esto:where('friends.myId', '==', true)
.Agregando a continuación lo que funcionó para mí usando referencias en Firestore.
Como dicen las otras respuestas, es como una clave externa. Sin embargo, el atributo de referencia no devuelve los datos del documento de referencia. Por ejemplo, tengo una lista de productos, con una referencia de UserRef como uno de los atributos del producto. Obtener la lista de productos me da la referencia del usuario que creó ese producto. Pero no me da los detalles del usuario en esa referencia. He usado otro back-end como servicios con punteros antes que tienen un indicador "populate: true" que devuelve los detalles del usuario en lugar de solo la identificación de referencia del usuario, lo cual sería genial tener aquí (con suerte, una mejora futura )
A continuación se muestra un código de ejemplo que utilicé para establecer la referencia, así como obtener la colección de la lista de productos y luego obtener los detalles del usuario a partir de la identificación de referencia del usuario dada.
Establecer una referencia en una colección:
Obtenga una colección (productos) y todas las referencias en cada documento (detalles del usuario):
Espero que esto ayude
fuente
db.collection('products').get()
. ¿Has intentado obtener un usuario directamente? Supongo quenewItem.userRef.get()
debería funcionar en lugar dedb.collection("users").doc(newItem.userRef.id).get()
uid
y la referencia a través de él.reference
si no podemos usarlo como una verdadera clave externa debería funcionar?reference
sobre astring
es que puede recurrirget()
directamente a la referencia. No es muy útil todavía. ¡Espero que agreguen una opción para completar automáticamente las referencias con los objetos correspondientes!Para aquellos que buscan una solución Javascript para realizar consultas por referencia, el concepto es que debe usar un objeto 'referencia de documento' en la declaración de consulta
(Felicitaciones a la respuesta aquí: https://stackoverflow.com/a/53141199/1487867 )
fuente