web-dev-qa-db-fra.com

À quoi sert le type de données de référence Firestore?

J'explore simplement le nouveau Firebase Firestore et il contient un type de données appelé reference . Ce n'est pas clair pour moi.

  • Est-ce comme une clé étrangère?
  • Peut-il être utilisé pour pointer sur une collection située ailleurs?
  • Si reference est une référence réelle, puis-je l'utiliser pour les requêtes? Par exemple, puis-je avoir une référence qui pointe directement vers l'utilisateur, au lieu de stocker l'ID utilisateur dans un champ de texte? Et puis-je utiliser cette référence utilisateur pour interroger?
128

Les références ressemblent beaucoup aux clés étrangères.

Les SDK actuellement publiés ne peuvent pas stocker de références à d'autres projets. Dans un projet, les références peuvent pointer vers tout autre document d'une autre collection.

Vous pouvez utiliser des références dans les requêtes comme toute autre valeur: pour le filtrage, la commande et la pagination (startAt/startAfter).

Contrairement aux clés étrangères d'une base de données SQL, les références ne sont pas utiles pour effectuer des jointures dans une requête unique. Vous pouvez les utiliser pour des recherches dépendantes (qui ressemblent à des jointures), mais soyez prudent, car chaque saut entraîne un autre aller-retour vers le serveur.

64
Gil Gilbert

Ajouter ci-dessous ce qui a fonctionné pour moi en utilisant des références dans Firestore.

Comme le disent les autres réponses, c'est comme une clé étrangère. L'attribut de référence ne renvoie cependant pas les données du document de référence. Par exemple, j'ai une liste de produits, avec une référence userRef comme l'un des attributs du produit. Obtenir la liste des produits me donne la référence de l'utilisateur qui a créé ce produit. Mais cela ne me donne pas les détails de l'utilisateur dans cette référence. J'ai déjà utilisé d'autres serveurs en tant que services avec des pointeurs ayant auparavant un indicateur "populate: true" qui donne les détails de l'utilisateur au lieu de simplement l'identifiant de référence de l'utilisateur, ce qui serait bien d'avoir ici (espérons une amélioration future ).

Vous trouverez ci-dessous un exemple de code que j'ai utilisé pour définir la référence et obtenir la liste de la collection de produits, puis obtenir les détails de l'utilisateur à partir de l'ID de référence de l'utilisateur indiqué.

Définir une référence sur une collection:

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

Obtenir une collection (produits) et toutes les références sur chaque document (informations utilisateur):

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) });

J'espère que cela t'aides

91
Ben Cochrane

Pour ceux qui recherchent une solution Javascript pour interroger par référence - le concept est que vous devez utiliser un objet 'référence de document' dans l'instruction de requête.

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

(Félicitations à la réponse ici: https://stackoverflow.com/a/53141199/1487867 )

1
Aswin Kumar