如何获取Firebase对象的密钥

时间:2016-04-19 07:27:57

标签: arrays json firebase firebase-realtime-database

如何在不使用快照的情况下获取Firebase对象的密钥?

我完成了以下研究。

使用代码:

var ref = new Firebase('https://johnsoncompany.firebaseio.com/people')

var firstPerson = ref.orderByChild("first").limitToFirst(1);

var key = $firebaseObject(firstPerson);

..我得到以下对象:

{  
   "5":{  
      "first":"Jennifer",
      "last":"Robert",
      "mobile":"121 364 135",
   }
}

Firebase给了我的对象关键" 5"因为数据包含在值数组中。这是第6个值。

挑战在于,为了获得价值" Jennifer",我必须知道关键是" 5"。

然后我将使用代码:

var firstPerson = $firebaseObject(ref.child('5'))

var firstName = firstPerson.first; //Returns Jennifer

我知道我可以使用下面的代码获取密钥' 5':

    ref.orderByChild("first").limitToFirst(1).once("child_added", function(snapshot) {
        alert(snapshot.key());
    }); 

挑战在于它返回密钥之前有一段延迟。这会导致应用程序出现故障。

有没有办法可以获得没有快照的密钥

ref.orderByChild("first").limitToFirst(1).key(); //This doesn't work

3 个答案:

答案 0 :(得分:2)

我知道您现在可能已经找到了解决问题的方法,但这是我用来检索对象密钥的方法。然后我使用相同的密钥运行另一个查询(过滤器)。

itemsRef.on('value', (snap) => {
  var items = [];
  snap.forEach((child) => {
    items.push({
      active: child.val().active,
      profile: child.val().profile,
      image: child.val().image,
      description: child.val().description,
      title: child.val().title,
      _key:child.key, //<--------------this is where I get the key
    });
  });
  this.setState({
    dataSource: this.state.dataSource.cloneWithRows(items),
  });
});

答案 1 :(得分:0)

您也可以使用spread运算符来指定:

itemsRef.on('value', (snap) => {
  var items = [];
  snap.forEach((child) => {
    items.push({
      _key: child.key,
      ...child.val()
    });
  });

});

在向您的数据添加新属性时更轻松,无需维护代码。

答案 2 :(得分:0)

我找到了解决方法,您可以看看是否有帮助

ArticlesRef.orderByChild('title')
        .equalTo('one2three')
         .once('value')
         .then(function(snapshot){
            let value = snapshot.val()
            if(value){
            let key = Object.keys(value)[0];
            //since the value is an object you can get the key given by firebase
            //you can add more code});