如何从 Firebase 数据快照中获取密钥?

Posted

技术标签:

【中文标题】如何从 Firebase 数据快照中获取密钥?【英文标题】:How to get the key from a Firebase data snapshot? 【发布时间】: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 之间。

【问题讨论】:

【参考方案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 操作,并且确实获取了信息,但由于范围的原因,我失去了这些值。你对此有什么建议吗?这会很有帮助。

以上是关于如何从 Firebase 数据快照中获取密钥?的主要内容,如果未能解决你的问题,请参考以下文章

如何快速从 firebase 获取用户的特定数据?

我想通过特定的“存储桶/密钥”直接从数据库中获取Firebase数据

从 Firebase 数据快照获取 JSON 键值

如何在不从参考节点获取所有数据的情况下获取 Firebase 数据库中的随机键?

如何将来自 Firebase 的查询快照转换为不同的对象?

如何将firebase快照值从一个函数提取到另一个函数变量?