À quoi sert le type de données Firebase Firestore 'Reference'?

189

J'explore juste le nouveau Firebase Firestore et il contient un type de données appelé reference. Ce 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 qui se trouve ailleurs?
  • S'il references'agit d'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 le userId dans un champ de texte? Et puis-je utiliser cette référence utilisateur pour interroger?
Jürgen Brandstetter
la source
18
Je pense que cette vidéo de l'équipe Firebase vous l'explique: youtube.com/watch?v=Elg2zDVIcLo (regarder à partir de 4:36)
Adarsh

Réponses:

91

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 n'importe quel autre document de n'importe quelle autre collection.

Vous pouvez utiliser des références dans les requêtes comme toute autre valeur: pour le filtrage, le classement 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 des recherches dépendantes (qui ressemblent à des jointures), mais soyez prudent car chaque saut entraînera un autre aller-retour vers le serveur.

Gil Gilbert
la source
9
S'il vous plaît, pouvez-vous partager des cas d'utilisation possibles? Est-il possible d'interroger des champs dans cette référence? Par exemple, j'ai une friendscollection répertoriant tous mes amis ( friends/myId). Ensuite, je référence ce document dans le friendschamp d'un autre document ( group/groupId). Je voudrais afficher que mes amis qui sont dans ce groupe, faire quelque chose comme ceci: where('friends.myId', '==', true).
Sera
108
Btw, il peut être utile de mettre à jour les documents pour inclure un exemple d'ajout d'un type de référence.
Sera
11
Je ne trouve aucune information à ce sujet? Cela va changer toute la structure de ma base de données, j'ai besoin d'en savoir plus ...
Ruben
3
avez-vous un exemple (de préférence en swift) sur la façon d'interroger en utilisant la référence? pour le moment, je peux le faire en stockant l'uid brut sous forme de chaîne, mais cela ne semble pas correct.
Mickey Cheong
6
J'ai besoin de changer tous mes types de référence en chaînes car la requête échouera toujours avec un type de référence. Je ne trouve littéralement rien sur la façon d'interroger par type de référence: (si quelqu'un découvre comment interroger par types de référence, faites-le moi savoir ...
Sam Trent
133

Ajout 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 reference 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 utilisé un autre back-end en tant que services avec des pointeurs avant qui ont 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 génial d'avoir ici (avec un peu de chance une amélioration future ).

Vous trouverez ci-dessous 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 utilisateur donné.

Définissez 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);

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

Ben Cochrane
la source
3
Merci d'avoir partagé! Je pense qu'il y a une faute de frappe dans la première ligne de la partie Get et cela devrait l'être db.collection('products').get(). Avez-vous essayé d'obtenir l'utilisateur directement? Je suppose que cela newItem.userRef.get()devrait fonctionner à la place dedb.collection("users").doc(newItem.userRef.id).get()
Sergey Nefedyev
53
Tout d'abord merci pour l'exemple. J'espère qu'ils ajouteront un "populate: true" pour l'avenir. Sinon, sauvegarder une référence est quelque peu inutile. La même chose aurait pu être faite en sauvegardant simplement la uidréférence et via celle-ci.
Jürgen Brandstetter
4
Merci pour l'exemple! Mais quel est l'intérêt de stocker le type de référence s'il n'y a pas d'option de type «peupler» lorsque nous interrogeons le document? S'il y a une option de remplissage que quelqu'un connaît, veuillez me le faire savoir.
Harshil Shah
18
Donc en fait ce n'est pas comme une clé étrangère. Pour moi, cela ne fait fondamentalement rien - quel est l'intérêt d'avoir referencesi nous ne pouvons pas l'utiliser comme une véritable clé étrangère devrait fonctionner?
jean d'arme
14
Le seul avantage de a referencesur a stringest que vous pouvez appeler get()directement la référence. Pas encore très utile. J'espère qu'ils ajoutent une option pour remplir automatiquement les références avec les objets correspondants!
morgler
16

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 )

Aswin Kumar
la source