How to get the key from a Firebase data snapshot?

前端 未结 5 1216
南旧
南旧 2021-02-01 02:52

I\'m able to query my users array with an e-mail address and return the user\'s account info:

users.orderByChild(\'email\').equalTo(authData.user.em         


        
相关标签:
5条回答
  • 2021-02-01 03:21

    Realtime database:

    For this you can simple use: snapshot.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];
                }
            });
    
    0 讨论(0)
  • 2021-02-01 03:22

    Similar to camden_kid, I used Object.keys(arr), but in three lines:

    var arr = snapshot.val();
    var arr2 = Object.keys(arr);
    var key = arr2[0];
    console.log(key) // -KiBBDaj4fBDRmSS3j0r
    
    0 讨论(0)
  • 2021-02-01 03:24

    users.orderByChild('email').equalTo(authData.user.email) is a Query (doc) that you have built by "chaining together one or more of the filter methods". What is a bit specific with your query is that it returns a dataSnapshot with only one child, since you query with equalTo(authData.user.email).

    As explained here, in this exact case, you should loop over the returned dataSnapshot with forEach():

    Attaching a value observer to a list of data will return the entire list of data as a single snapshot which you can then loop over to access individual children.

    Even when there is only a single match for the query, the snapshot is still a list; it just contains a single item. To access the item, you need to loop over the result, as follows:

    ref.once('value', function(snapshot) {
      snapshot.forEach(function(childSnapshot) {
        var childKey = childSnapshot.key;
        var childData = childSnapshot.val();
        // ...
      });
    });
    
    0 讨论(0)
  • 2021-02-01 03:29

    I found new way to get the data based on snapshot key -

     firebase.database().ref('events').once('value',(data)=>{
          //console.log(data.toJSON());
          data.forEach(function(snapshot){
            var newPost = snapshot.val();
            console.log("description: " + newPost.description);
            console.log("interest: " + newPost.interest);
            console.log("players: " + newPost.players);
            console.log("uid: " + newPost.uid);
            console.log("when: " + newPost.when);
            console.log("where: " + newPost.where);
          })
          })
    
    0 讨论(0)
  • 2021-02-01 03:33

    You could do something like this:

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

    Ref: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

    The Object.keys() method returns an array of a given object's own enumerable properties, in the same order as that provided by a for...in loop (the difference being that a for-in loop enumerates properties in the prototype chain as well).

    0 讨论(0)
提交回复
热议问题