Firebase(Web)无法使orderByChild工作

时间:2016-12-20 03:37:32

标签: javascript firebase firebase-realtime-database nosql

我知道这个问题有1000个答案,这部分原因让我感到困惑,因为我无法让它发挥作用。

我无法使orderByChild查询/过滤器正常工作。我已经查看了至少25个解释它的教程,指南和文章,他们似乎都说要做我正在做的事情:

var dbRef = firebase.database().ref();
var filterExperience = dbRef.child("Users").orderByChild('trade_general').equalTo('Construction');

filterExperience.on('child_added', snap => {

  // Just trying to figure out if anything's even happening
  console.log("Test" + snap.val());    

  // Set Card ID    
  $('#cand-card').attr('id', 'cand-card' + snap.key);

  // Set Name
  $('#fullname').attr('id', 'fullname' + snap.key);
            $('#fullname' + snap.key).text(snap.child("Personal").child("first_name").val() + " " + snap.child("Personal").child("last_name").val());

// And so on...

并且,为了记录,firebase全部设置正确。我的html页面底部有一个片段,我一直在阅读/写入记录,没有任何问题。

我的数据库如下所示:

Users
|
|--KYQ0L5TStcZM1rgVpte
    |
    |-Account
    |-Availability
    |-Education
    |-Location
    |-Work_History
      |
      |-Recent_Job_1
        |
        |-employer_name: "abc company"
        |-job_position: "concrete finisher"
        |-trade_general: "Construction"

我得到的结果是:绝对没有。在' snap'之后我运行的测试控制台中没有任何内容。页面上没有任何内容。

1 个答案:

答案 0 :(得分:0)

Firebase数据库查询会考虑您查询的位置下的每个,然后获取您指定的子项+条件。因此,如果路径已修复,您可以执行以下操作:

dbRef.child("Users")
     .orderByChild('Work_History/Recent_Job_1/trade_general')
     .equalTo('Construction')

因此,请考虑每个用户的Work_History/Recent_Job_1/trade_general和基于此的过滤器。

但最有可能Recent_Job_1是一条动态路径。在这种情况下,您尝试在嵌套的动态路径中查询属性,这在Firebase数据库的查询模型中是不可能的。 Firebase的索引本质上是单值映射,这种类型的查询不适用于那些。

您必须找到不同的数据结构才能允许您想要的查询。

这样做的一种方法是将最新的trade_general值作为每个用户下的直接属性。这将允许您按最新作业的trade_general值进行过滤。

或者,您可以设置不同的数据结构,将trade_general值映射到用户和作业。 E.g。

UsersJobTradeGenerals
  KYQ0L5TStcZM1rgVpte
    Construction
      Recent_Job_1: true
      Recent_Job_4: true
    OtherTradeGeneral
      Recent_Job_2: true
      Recent_Job_3: true