使用orderByChild和equalTo在Firebase查询中返回单个子项的值

时间:2018-03-22 20:38:01

标签: javascript firebase firebase-realtime-database

我正在尝试为当前登录firebase实时数据库的存储中的图像提取URL。

这是一个快照游戏 - 屏幕上会有两张牌(左图和右图),当两个匹配时,用户将点击快照。

我的所有图片网址都按以下方式存储:

database schema

每个人都有一个名为“索引”的独特孩子 - 我还有另一棵树,它只是每张图像记录的运行计数。所以目前我运行的函数检查当前计数的总和,然后执行随机函数生成随机数,然后使用orderByChild和包含随机索引号的equalTo在图像树上执行数据库查询。 p>

如果我记录了这个数据句,我可以看到一个记录的完整节点(索引,得分,网址,用户及其值),但是如果我尝试拉取URL,则返回值为Null。我可以,而不是恼人地,返回“URL”一词似乎在我的闲暇,但我无法得到潜在的价值。我想知道这是不是因为它是一个字符串而不是数字,但我找不到任何暗示这是一个问题。

请记住,我最多只学习Javascript大约一周,所以如果我犯了明显的菜鸟错误,那可能就是原因!

下面是一段代码片段,向您展示我的意思:

    var indRef = firebase.database().ref('index')
    var imgRef = firebase.database().ref('images')
    var leftImg = document.getElementById('leftImg')
    var rightImg = document.getElementById('rightImg')

    document.addEventListener('DOMContentLoaded', function(){

    indRef.once('value')
    .then(function(snapShot){

        var indMax = snapShot.val()
        return indMax;
    })
    .then(function(indMax){


        var leftInd = Math.floor(Math.random()* indMax + 1)
        imgRef.orderByChild('index').equalTo(leftInd).once('value', function(imageSnap){
            var image = imageSnap.child('url').val();
            leftImg.src=image; 
            })
        })
    })

1 个答案:

答案 0 :(得分:2)

对Firebase数据库执行查询时,可能会有多个结果。因此快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。

您的代码需要通过循环Snapshot.forEach()

来满足该列表的需要
   imgRef.orderByChild('index').equalTo(leftInd).once('value', function(imageSnap){
       imageSnap.forEach(function(child) {
         var image = child.child('url').val();
         leftImg.src=image; 
       })
    })