Firebase - 通过键或子节点值获取数据 - JavaScript

8
我正在尝试从Firebase数据库中读取数据,并在网页上显示相同的内容。
我的数据库结构如下 - Image here 如果您查看图像,我可以使用以下代码读取“UserData” -
firebase.initializeApp(config);
var database = firebase.database(); 

var ref = database.ref('UserData');
ref.once('value', gotData1, errData);

    function gotData1(data){
    //console.log(data.val());
    var usrData = data.val();
    var keys = Object.keys(usrData);
    //console.log(keys);

    for (var i = 0; i< keys.length; i++){
        var k = keys[i];
        var id = usrData[k].AssignedID;
        var name = usrData[k].Name;

        $(document).ready(function() {
             var $formrow = '<tr><td>'+id+'</td><td>'+name+'</td></tr>';
             $('#userInfo').append($formrow);
        });
     }
    }

在图像的突出显示部分,您可以看到值为196214、196215、196216的键。
现在,我需要通过匹配可用的AssignedID来获取"One, Count"的值。
我该如何达到相同的目的?
更新,JSON文本如下:
{
  "app_url" : "https://app_name?ls=1&mt=8",
  "UserData" : {
    "HNpTPoCiAYMZEeVOs01ncfGBj6X2" : {
      "Name" : "Arunima Vj"
      "Email" : "asd@upp.com",
      "AssignedID" : 196214
    },
    "VXU2tdGdzZX90PJa9mpEL3zAiZo2" : {
      "Name" : "Lakshman Medicherla"
      "Email" : "asd@upp.com",
      "AssignedID" : 196215
    },
    "dFlwtqDNrja2RkOySVtW106IQP62" : {
      "Name" : "Prashanth Sripathi"
      "Email" : "asd@upp.com",
      "AssignedID" : 196216
    }
  }
  "teams" : {
    "196214" : {
      "1105" : {
        "One" : 7619,
        "count" : 24
      },
      "1379" : {
        "Two" : 7145,
        "count" : 21
      }
    },
    "196215" : {
      "1111" : {
        "One" : 7779,
        "count" : 20
      },
      "1508" : {
        "Two" : 1176,
        "count" : 21
      }
    },
    "196216" : {
      "1106" : {
        "One" : 7845,
        "count" : 22
      },
      "1509" : {
        "Two" : 1156,
        "count" : 26
      }
    }
  }
}

1
您在问题中包含了JSON树的图片。请将其替换为实际的JSON文本,您可以通过单击 Firebase数据库控制台 中的“导出JSON”链接轻松获取它。将JSON作为文本使其可搜索,使我们能够轻松地使用它来测试您的实际数据并在答案中使用它,总体而言这是一件好事情。 - Frank van Puffelen
嗨,弗兰克,感谢您的评论。我只负责设计和开发Web应用程序,因此无法访问Firebase应用程序窗口。更新: 请检查,我已将JSON作为文本更新到帖子中。 - Prashanth kumar
@FrankvanPuffelen,请检查,我已经更新了帖子,并将JSON作为文本附加在其中。 - Prashanth kumar
1个回答

8

你的数据结构相当嵌套,这使得代码更难以阅读。但是,以下代码可以最小化通用地导航到该结构:

var ref = firebase.database().ref("/42824688");

ref.child("UserData").once('value', gotUserData);

function gotUserData(snapshot){
  snapshot.forEach(userSnapshot => {
    var k = userSnapshot.key;
    var id = userSnapshot.val().AssignedID;
    var name = userSnapshot.val().Name;
    ref.child("teams").child(id).once("value", teamsSnapshot => {
      teamsSnapshot.forEach(teamSnapshot => {
        var teamKey = teamSnapshot.key;
        teamSnapshot.forEach(teamProp => {
          var prop = teamProp.key;
          var val = teamProp.val();
          console.log(k+" "+name+" "+id+": "+teamKey+", "+prop+"="+val);
        });
      });
    });
  })
}

对于每个用户,它会加载该用户的团队数据,然后循环遍历 teamsSnapshot 来获取每个 teamSnapshot,然后再循环遍历 那个 来获取每个团队属性。

可用的 jsbin: http://jsbin.com/noziri/edit?html,js,console


谢谢Frank,这段代码真的帮了我。现在,我想将“one”和“count”的值分别存储到两个不同的变量中,但是当我尝试使用**var val = teamProp.val().count;**获取相同的值时,控制台会输出“undefined”,您有什么想法吗?再次感谢。 - Prashanth kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接