【问题标题】:How do I retrieve firebase data based on the key in a nested child?如何根据嵌套子项中的键检索 Firebase 数据?
【发布时间】:2022-01-21 12:49:49
【问题描述】:

假设我正在构建一个让用户管理旅行的应用程序。创建行程时,可以在其中添加任意数量的用户。我希望这些数据存储在一个地方,然后每个用户都能够检索该人所包含的行程。我的数据如下所示:

-trips
  -<trip-id>
    -title
    -budget
    -etc
    -people
     -<person-id>
       -name
       -uid
     -<person-id>
       -name
       -uid
  -<trip-id>
       -
       -
       -
        

此行程将包含所有用户创建的所有行程。为了向任何人展示他们的旅行,我只想检索该人所在的列表。

这是我尝试做的,包括其他类似的方法。

rootReference.child("trips").orderByChild("uid").equalTo(FirebaseAuth.instance.currentUser.uid).addValueEventListener(object:ValueEventListener){
override fun onDataChange(snapshot: DataSnapshot) {
   //this should only return the trips that current user exists in.
 }

}

我已经检查了有关在 firebase 上搜索和过滤的文档,但没有任何内容显示基于过滤的嵌套键。一个特别的例子是this。我完全理解。例如,如果我尝试根据标题、预算等主要属性过滤我的旅行,它会起作用,但当我使用嵌套子项的属性时就不行。

我可以使用哪些其他方法来根据嵌套键进行过滤,或者我应该以不同的方式构建数据?非常感谢任何帮助。

【问题讨论】:

    标签: android kotlin firebase-realtime-database


    【解决方案1】:

    Firebase 实时数据库查询直接在您查询的路径下的子节点的平面列表上运行。

    因此,您订购/过滤的值必须位于每个直接子节点下的固定路径。由于您的 uid 不是这种情况,因此您无法在所有行程中查询这些行程的所有用户的 UID。

    您可以在一次行程中查询用户的 UID(然后返回该用户),或者您可以在所有行程中查询行程本身的属性,例如其标题或预算。

    如果您想查询所有用户的所有行程,请考虑保留一个附加列表,其中您以用户的 UID 作为键,然后将他们的所有行程都放在下面:

    "user_trips": {
      "uid1": {
        "tripid1": true,
        "tripid2": true
      },
      "uid2": {
        "tripid2": true,
        "tripid3": true
      }
    }
    

    另见:

    【讨论】:

    • 这种方法在一般情况下是有效的,但最好的方式是聆听所有这些旅行中的变化。我可以根据“user_trips”中的 ID 获取行程,但随后我必须为每个行程单独添加一个 ValueEventListener,这不是我想要的。
    • 您可以将侦听器附加到您从查询中返回的每个行程 ID,但如果这个数字可能很大(几十个很好,几百个可能有点多),您最终会得到很多听众。在这种情况下,请考虑复制您需要检测user_trips 中的变化的数据,例如例如,通过存储上次更新行程的时间戳作为那里的值。通过这样做,写入再次变得更加复杂,但查询变得更简单。这是使用 NoSQL 数据库时的常见权衡。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    相关资源
    最近更新 更多