(Javascript)访问Firebase RealtimeDatabase

时间:2018-05-07 08:59:55

标签: javascript firebase firebase-realtime-database

我遇到了一个问题,我不知道解决方案。 在Firebase RealtimeDatabase中,我通过ref.push();创建了一个字符串列表 现在我需要稍后访问我通过ref.push();创建的最后一个对象。 因为我需要在另一个实例中访问它,所以我无法直接从函数中获取新引用的键。

检索此类列表的最后一项的正确方法是什么? 我以各种方式摆弄(即,像正常数组一样访问,然后抓取该数组的最后一个元素),但到目前为止没有任何工作。

如果有人可以帮助我,我会很高兴。

编辑:

数据库的相关部分如下所示:

relevant_part

我通过调用

在另一个函数中创建了列表
var newRef = admin.database().ref(`PATH/TO/LIST`).push();
newRef.set("someString");

因为我生成了之前的项目,所以我不能只将newRef传递给我需要的函数来访问该项目。

1 个答案:

答案 0 :(得分:2)

请执行以下操作:

firebase.database().ref('PATH/TO/LIST').limitToLast(1).once('value')
.then(function(snapshot) {
     snapshot.forEach(function(childSnapshot) {
         console.log(childSnapshot.val());
     });
});

需要注意的两点:

  1. “push()生成的唯一键按当前时间排序,因此生成的项目列表将按时间顺序排序”,如文档中所述:https://firebase.google.com/docs/reference/js/firebase.database.Reference#push。因此,您的商品按时间顺序排序。
  2. 你必须遍历一次的结果,因为在构造limitToLast()时使用了query方法,它总是返回一组“记录”(即DataSnapshot为与您的查询匹配的数据子集),即使查询结果只是一个项目。
  3. 编辑以下评论:

    var ref = firebase.database().ref('PATH/TO/LIST');
    
    ref.limitToLast(1).once('value')
    .then(function(snapshot) {
        var itemKey;
        snapshot.forEach(function(childSnapshot) {
           itemKey = childSnapshot.key;
           console.log(itemKey);
        });
    
        return ref.child(itemKey).set('someString3NEW');
    
    })
    .catch(function(error) {
      console.log(error);
    });
    

    您获得要更改的节点的密钥(使用与上面相同的查询),并使用set()方法更改其值。