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

J'explore juste le nouveau Firebase Firestore et il contient un type de données appelé reference. Il n'est pas clair pour moi ce que cela fait.

  • est-ce comme une clé étrangère?
  • peut-il être utilisé pour pointer vers une collection située ailleurs?
  • Si reference est une véritable référence, 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 pour l'interrogation?
79
demandé sur Jürgen Brandstetter 2017-10-04 18:37:59

2 réponses

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

Les SDK actuellement publiés ne peuvent pas stocker les références à d'autres projets. Dans un projet, les références peuvent pointer vers n'importe quel autre document dans n'importe quelle autre collection.

Vous pouvez utiliser des références dans les requêtes comme n'importe quelle autre valeur: pour le filtrage, l'ordre et la pagination (startAt/startAfter).

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

42
répondu Gil Gilbert 2018-10-01 22:08:59

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 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 sur le produit. Obtenir la liste des produits, me donne la référence de l'utilisateur qui a créé ce produit. Mais il ne me donne pas les détails de l'utilisateur dans cette référence. J'ai utilisé d'autres back end en tant que services avec des pointeurs avant cela ont un drapeau "populate: true" qui donne les détails de l'utilisateur au lieu de simplement l'id de référence de l'utilisateur, ce qui serait génial d'avoir ici (j'espère une amélioration future).

Voici un exemple de code que j'ai utilisé pour définir la référence ainsi que pour 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 donné.

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

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

Obtenez une collection (produits) et toutes les références sur chaque document (détails de l'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 aide

44
répondu Ben Cochrane 2018-09-07 06:15:18