¿Para qué sirve el tipo de datos 'Referencia' de Firebase Firestore?

Resuelto Jürgen Brandstetter asked hace 54 años • 9 respuestas

Recién 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 externa?
  • ¿Se puede utilizar para señalar una colección que se encuentra en otro lugar?
  • Si referencees una referencia real, ¿puedo utilizarla 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 utilizar esta referencia de usuario para realizar consultas?
Jürgen Brandstetter avatar Jan 01 '70 08:01 Jürgen Brandstetter
Aceptado

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 usuario como uno de los atributos del producto. Al 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 "poblar: verdadero" que devuelve los detalles del usuario en lugar de solo la identificación de referencia del usuario, lo cual sería genial tenerlo aquí (con suerte, una mejora futura). ).

A continuación se muestra un código de ejemplo que utilicé para establecer la referencia y obtener la lista de productos y luego obtener los detalles del usuario a partir de la identificación de referencia del usuario proporcionada.

Establecer una referencia en una colección:

let data = {
  name: 'productName',
  size: 'medium',
  userRef: db.doc('users/' + firebase.auth().currentUser.uid)
};
db.collection('products').add(data);

Obtenga una colección (productos) y todas las referencias de cada documento (datos del usuario):

db.collection('products').get()
    .then(res => {
      vm.mainListItems = [];
      res.forEach(doc => {
        let newItem = doc.data();
        newItem.id = doc.id;
        if (newItem.userRef) {
          newItem.userRef.get()
          .then(res => { 
            newItem.userData = res.data() 
            vm.mainListItems.push(newItem);
          })
          .catch(err => console.error(err));
        } else {
          vm.mainListItems.push(newItem);  
        }
        
      });
    })
    .catch(err => { console.error(err) });
Ben Cochrane avatar Dec 06 '2017 11:12 Ben Cochrane

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 de cualquier otra colección.

Puede utilizar referencias en consultas como cualquier otro valor: para filtrar, ordenar y paginar (startAt/startAfter).

A diferencia de las claves externas en una base de datos SQL, las referencias no son útiles para realizar uniones en una única consulta. Puede usarlos para búsquedas dependientes (que parecen unirse), pero tenga cuidado porque cada salto resultará en otro viaje de ida y vuelta al servidor.

Gil Gilbert avatar Oct 04 '2017 16:10 Gil Gilbert

Para aquellos que buscan una solución Javascript para realizar consultas por referencia, el concepto es que deben usar un objeto de 'referencia de documento' en la declaración de consulta.

teamDbRef = db.collection('teams').doc('CnbasS9cZQ2SfvGY2r3b'); /* CnbasS9cZQ2SfvGY2r3b being the collection ID */
//
//
db.collection("squad").where('team', '==', teamDbRef).get().then((querySnapshot) => {
  //
}).catch(function(error) {
  //
});

(Felicitaciones a la respuesta aquí: https://stackoverflow.com/a/53141199/1487867 )

Aswin Kumar avatar May 19 '2019 20:05 Aswin Kumar

Según #AskFirebase https://youtu.be/Elg2zDVIcLo?t=276, el caso de uso principal por ahora es un enlace en la interfaz de usuario de la consola Firebase.

Pavel Shastov avatar Sep 21 '2020 08:09 Pavel Shastov