如何从 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
返回users
。 snapshot.child('email').key
返回 email
。密钥似乎不是一个孩子,即它似乎在users
和email
之间。
【问题讨论】:
【参考方案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数据