我知道这个问题有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'之后我运行的测试控制台中没有任何内容。页面上没有任何内容。
答案 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