【问题标题】:How to get the key from a Firebase data snapshot?如何从 Firebase 数据快照中获取密钥?
【发布时间】:2017-09-22 18:01:24
【问题描述】:

我可以使用电子邮件地址查询我的users 数组并返回用户的帐户信息:

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'
        ...

如何获得密钥 (-KiBBDaj4fBDRmSS3j0r)。 snapshot.key 返回userssnapshot.child('email').key 返回 email。密钥似乎不是一个孩子,即它似乎在usersemail 之间。

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    你可以这样做:

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

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

    Object.keys() 方法返回给定对象自己的数组 可枚举的属性,与 a 提供的顺序相同 for...in 循环(区别在于 for-in 循环枚举 原型链中的属性)。

    【讨论】:

    • 快速响应!谢谢!
    【解决方案2】:

    与 camden_kid 类似,我使用了Object.keys(arr),但分三行:

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

    【讨论】:

      【解决方案3】:

      实时数据库

      为此,您可以简单地使用:snapshot.key

      快照 = 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

      快照 = 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];
                  }
              });
      

      【讨论】:

      • 与其他答案相比,这是最正确的答案。
      【解决方案4】:

      users.orderByChild('email').equalTo(authData.user.email) 是您通过“将一个或多个过滤方法链接在一起”构建的查询 (doc)。您的查询有一点特别之处在于,它返回一个只有一个孩子的 dataSnapshot,因为您使用 equalTo(authData.user.email) 进行查询。

      正如here 解释的那样,在这种情况下,您应该使用forEach() 循环返回的dataSnapshot:

      将值观察者附加到数据列表会将整个数据列表作为单个快照返回,然后您可以循环访问单个子节点。

      即使查询只有一个匹配项,快照也是 仍然是一个列表;它只包含一个项目。要访问该项目, 需要循环遍历结果,如下:

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

      【讨论】:

      • 这实际上是 Firebase 文档中推荐的方式!
      【解决方案5】:

      我找到了基于快照键获取数据的新方法 -

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

      【讨论】:

      • 我遇到了与 OP 几乎相同的问题,并结束了执行此操作和其他类型的 foreach/for 操作,并且确实获取了信息,但由于范围的原因,我失去了这些值。你对此有什么建议吗?这会很有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多