如何使用子字符串查询firebase键

时间:2018-02-21 01:33:51

标签: javascript firebase firebase-realtime-database

我想查询包含输入的Firebase。例如,在下面的数据库结构中,我想查询包含" 4140"的所有节点。 所以我使用这段代码

enter image description here

  var catref = Cataloguedatabase.ref("/Listing Search/");


    return catref.once('value').then(function(snapshot){
    snapshot.forEach(childSnapshot => { 

    let snapdb = childSnapshot.val();
    let key = childSnapshot.key;
    //use ES6 includes function
    if(key.includes(schname)){  

    console.log(childSnapshot.val());
    var searchresults = childSnapshot.val();
    var container = document.getElementById('listing_gallery');
                      // container.innerHTML = '';

    var productCard = `
        <div class="col-sm-3">
        <div class="card" onclick="gotoproduct(this);" id="${key}">
                              `
         container.innerHTML += productCard;
                    }
                })
              })

这样可行,但问题是它首先查询所有子节点并对数组进行排序。这对于有少数子节点的节点是可以的,但是当它到达成千上万的子节点时,它变得不切实际。是否有一个我只能查询密钥包含firebase中的值,如果没有,我怎么能实现这个?

2 个答案:

答案 0 :(得分:3)

正如Doug所说,无法查询包含某个字符串的值。但是可以查询某个子字符串开头的键:

return catref.orderByKey().startAt("4140-").endAt("4140-\uf8ff").once('value').then(function(snapshot){

这将匹配其键以4140-开头的子节点。

答案 1 :(得分:0)

Firebase实时数据库无法提出您的问题。没有子字符串查询。

如果您只对查询的前四个字符感兴趣,那么您可以做的是将该字符串存储为该节点内的子项,然后将orderByChild()存储在该子节点上以仅查找那些从一个特定的四个字符序列开始。

您可以在documentation中了解有关订购的更多信息。