这个 orderByChild Firebase 实时代码有啥问题?

Posted

技术标签:

【中文标题】这个 orderByChild Firebase 实时代码有啥问题?【英文标题】:What is wrong with this orderByChild Firebase realtime code?这个 orderByChild Firebase 实时代码有什么问题? 【发布时间】:2021-09-18 09:13:38 【问题描述】:

此代码返回错误。谁能指导我这是什么问题?

DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference("Doctor");

dbRef.keepSynced(true);

DatabaseReference dbRef2 = FirebaseDatabase.getInstance().getReference("Patient").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
Query query = dbRef.orderByChild("filter").equalTo(passed,dbRef2.child("location").toString());

FirebaseRecyclerOptions<DoctorHelperClass> options = new FirebaseRecyclerOptions.Builder<DoctorHelperClass>()
                .setQuery(query, DoctorHelperClass.class).build();

【问题讨论】:

错误是什么? 【参考方案1】:

问题可能出在这里:

Query query = dbRef.orderByChild("filter").equalTo(passed,dbRef2.child("location").toString());

如果有多个节点具有相同的filter值。equalTo的第二个参数用于进一步限制返回的结果。它确实指明了要过滤的属性的名称,您可能会这么认为。

过滤的完整路径需要在对orderByChild的调用中。因此,如果您想对每个子节点的 filter/location 属性进行排序/过滤,那就是:

Query query = dbRef.orderByChild("filter/location").equalTo(passed);

更新:因为您表示要对两个属性进行排序/过滤。

Firebase 数据库查询只能对单个属性进行排序/过滤。在许多情况下,可以将要过滤的值组合成单个(合成)属性。例如,在您的情况下,您可以在"location_specialization": "locationValue_specializationValue" 上订购/过滤。

有关此方法和其他方法的示例,请在此处查看我的答案:Query based on multiple where clauses in Firebase

【讨论】:

但我希望它等同于两个不同的值。除了位置,我还想比较专业化。我该怎么做? Firebase 数据库查询只能对单个属性进行排序/过滤。在许多情况下,可以将要过滤的值组合成单个(合成)属性。例如,在您的情况下,您可以在"location_specialization": "locationValue_specializationValue" 上订购/过滤。有关此方法和其他方法的示例,请在此处查看我的答案:***.com/questions/26700924/…

以上是关于这个 orderByChild Firebase 实时代码有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

orderByChild 在 Firebase 中不起作用

Firebase .orderByChild().equalTo().once().then() 当孩子不存在时承诺

firebase 和 Ionic 2 上的降序 orderByChild()

Flutter:Firebase 实时数据库 orderByChild 对查询结果没有影响

firebase 查询 orderByChild().equalTo() android kotlin 的问题

OrderByKey 工作正常,但 OrderByChild 在 firebase 实时数据库中给出了意想不到的结果