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

时间:2017-04-25 15:51:13

标签: javascript firebase firebase-realtime-database

我可以使用电子邮件地址查询我的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'
        ...

enter image description here

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

5 个答案:

答案 0 :(得分:31)

你可以这样做:

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循环枚举   原型链中的属性也是如此。

答案 1 :(得分:16)

实时数据库

为此您可以简单地使用: 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];
            }
        });

答案 2 :(得分:4)

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

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

答案 3 :(得分:1)

users.orderByChild('email').equalTo(authData.user.email)是一个查询(doc),您通过“将一个或多个过滤方法链接在一起”构建。您查询的具体内容是它返回的数据快照只有一个子,因为您使用equalTo(authData.user.email)进行查询。

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

  

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

     

即使查询只有一个匹配项,快照也是如此   还是一个清单;它只包含一个项目。要访问该项目,   您需要遍历结果,如下所示:

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

答案 4 :(得分:0)

我发现了一种基于快照密钥获取数据的新方法-

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