web-dev-qa-db-fra.com

Comment obtenir la clé d'un instantané de données Firebase?

Je suis en mesure d'interroger mon tableau users avec une adresse de messagerie et de renvoyer les informations de compte de l'utilisateur:

users.orderByChild('email').equalTo(authData.user.email).once('value').then(function(snapshot) {
        console.log(snapshot.val());
        console.log(snapshot.key); // 'users'
        console.log(snapshot.child('email').key); 'email'
        ...

 enter image description here

Comment puis-je obtenir la clé (-KiBBDaj4fBDRmSS3j0r). snapshot.key renvoie users. snapshot.child('email').key renvoie email. La clé ne semble pas être un enfant, c’est-à-dire qu’elle semble être entre users et email

18
Thomas David Kehoe

Vous pouvez faire quelque chose comme ça:

var key = Object.keys(snapshot.val())[0];

Réf.: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

La méthode Object.keys () renvoie un tableau du propre objet propriétés énumérables, dans le même ordre que celui fourni par un for ... en boucle (la différence étant qu'une boucle for-in énumère également les propriétés de la chaîne de prototypes).

28
camden_kid

Base de données en temps réel:

Pour cela, vous pouvez utiliser simplement: instantané.key

snapshot = firebase.database.DataSnapshot

this.app.database()
        .ref('/data/')
        .on('value', function(snapshot) {
            const id = snapshot.key;

            //----------OR----------//
            const data = snapshot.val() || null;
            if (data) {
              const id = Object.keys(data)[0];
            }
        });

Firestore:

snapshot.id

snapshot = firebase.firestore.DocumentSnapshot

this.app.firestore()
        .collection('collection')
        .doc('document')
        .onSnapshot(function(snapshot) {
            const id = snapshot.id;

            //----------OR----------//
            const data = snapshot.data() || null;
            if (data) {
              const id = Object.keys(data)[0];
            }
        });
11
Ernestyno

Comme pour camden_kid, j’ai utilisé Object.keys(arr), mais en trois lignes:

var arr = snapshot.val();
var arr2 = Object.keys(arr);
var key = arr2[0];
console.log(key) // -KiBBDaj4fBDRmSS3j0r
4
Thomas David Kehoe

users.orderByChild('email').equalTo(authData.user.email) est une requête ( doc ) que vous avez construite en "chaînant ensemble une ou plusieurs des méthodes de filtrage". Ce qui est un peu spécifique avec votre requête, c'est que il retourne un dataSnapshot avec un seul enfant, puisque vous interrogez avec equalTo(authData.user.email).

Comme expliqué ici , dans ce cas précis, vous devez parcourir le dataSnapshot renvoyé avec forEach():

Si vous associez un observateur de valeurs à une liste de données, la liste complète des données sera renvoyée sous la forme d'un instantané unique que vous pourrez ensuite parcourir pour accéder à des enfants individuels.

Même s'il n'y a qu'une seule correspondance pour la requête, l'instantané est encore une liste; il ne contient qu'un seul élément. Pour accéder à l’article, vous devez parcourir le résultat, comme suit:

ref.once('value', function(snapshot) {
  snapshot.forEach(function(childSnapshot) {
    var childKey = childSnapshot.key;
    var childData = childSnapshot.val();
    // ...
  });
});
0
Renaud Tarnec