gpt4 book ai didi

java - Firebase - 按(孙) child 的存在进行查询

转载 作者:行者123 更新时间:2023-12-02 02:44:28 26 4
gpt4 key购买 nike

我有一个这样的数据路径

events
-KntTJCVBtbrb79dHemC
dateStamp: 1498747689858
admin: "rPxwIzEtJaRbEH6ujkP5QJgpHDp2"
attending:
rPxwIzEtJaRbEH6ujkP5QJgpHDp2: true
MtaPwHEKMEOTXBRdXBuXuS3gst12: false

我想获取有特定用户参加的 Activity 。换句话说,我想获取键“attending/[some-user-id]”存在的所有事件

问题是我只能通过按该路径的特定值(true 或 false)进行过滤来完成此操作,如下所示:

eventsRef.orderByChild("attending/" + user.getId()).equalTo(true).addListenerForSingleValueEvent(...)

这有效,但仅适用于键值为 true 的情况,因此为了获得我需要的内容,我必须执行 2 次调用,一次调用当值 true 时,一次调用当 value 为 false 时。

我尝试使用 startAt(true)endAt(false) (反之亦然),但最终什么也没返回。

我不确定我错过了什么。

编辑

我应该指定我知道这可以通过非规范化并使用另一个节点作为关系“表”来完成,我只是想知道上述情况是否可能,因为它已经如此接近并且可以避免 2-首先获取 key ,然后检索实际数据的步骤过程。

最佳答案

这就是数据非规范化发挥作用的时候!

您所描述的是查询孙子的唯一方法。当然,正如您提到的,它不是很直观、有用或快速。

您要做的就是为参加给定 Activity 的用户创建一个单独的节点。您可以将其命名为UsersAttendingTheEvent。这将具有作为子项的事件键。每当用户开始参加给定事件时,请将用户 key 添加为事件 key 的子项(因此是 UsersAttendingTheEvent 的孙子。

例如,

UsersAttendingTheEvent:{
-KntTJCVBtbrb79dHemC:{
rPxwIzEtJaRbEH6ujkP5QJgpHDp2: true
MtaPwHEKMEOTXBRdXBuXuS3gst12: false
}}

现在,当您想要运行查询时,只需对 UsersAttendingTheEvent 运行一个简单的 orderByChild(userId) 查询即可获取该事件的所有键。用户正在参加。

接下来,您可以从主 event/eventKey 获取事件详细信息。这可能看起来像是一个额外的调用,但这就是 Firebase 数据非规范化的设计方式。另外,它的运行速度相当快。

编辑

您的 startAt(true) 和 endAt(false) 没有返回任何内容的原因是,当调用 orderByChild() 时,订单返回的项目如下:-

  1. 真实
  2. 数字
  3. 按字典顺序

本页提到了这一点https://firebase.google.com/docs/database/android/lists-of-data .

尝试仅使用startAt(true)。如果您确保您的成员键只有 true 或 false 值,并且在 true 之后不会按字典顺序返回其他值,那么这将起作用。

关于java - Firebase - 按(孙) child 的存在进行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44860604/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com