【问题标题】:Retrieving Multi-Query with Firebase使用 Firebase 检索多查询
【发布时间】:2016-06-03 02:43:56
【问题描述】:

我正在尝试为我的用户创建一个对话室节点。我有具有fromto 用户ID 的节点。在创建新房间之前,我需要检查这两种情况,其中“from”是主机,to 是对手,“to”是主机,“from”是对手。

节点看起来像:

 - Rooms
    - "id1"
      - from: 2
      - to: 1

我想做的基本上是:

from = 1 and to = 2 OR from = 2 and to = 1 的房间中选择所有

有没有办法在一个查询中检查这两种情况?我对使用 Firebase 查询复杂数据的性质感到困惑。

【问题讨论】:

  • 处理这些 1:1 对话的最简单方法是以参与用户的名字命名房间。有关示例,请参见 stackoverflow.com/questions/33540479/…
  • 哇。太精彩了。谢谢!通过这种方式,您是否建议将“房间+对话”结合起来并且只有一张桌子?或者如果我在同一张桌子上有消息和房间,会不会影响性能?
  • 这是一种让相同的参与者最终进入同一个聊天室的方法。本质上,房间只是“命名对话”。或者反过来:对话实际上只是“我们使用 uid 作为房间名称的房间”。如果用户一次只查看一个房间或对话,则不存在性能问题。如果这是您采用的解决方案,我会将这个问题标记为重复的顺便说一句。

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

在 firebase 中没有直接的方法可以通过两个不同的子节点进行查询,唯一的子节点查询方法是:

 myRefToRooms.orderByChild('from').equalTo($user_id)

也就是说,您可以在每个房间中创建一个使用两个 uid 创建的查询子项:

 rooms:{
  $room_id:{
    from:$user_from,
    to:$user_to,
    query:$userfrom_$userto
  }
 }

这样你可以得到所有符合两个条件的值

myRefToRooms.orderByChild('query').equalTo($user1_$user2)

您还可以在查询中使用 startAt() 和 endAt() 方法,不仅可以找到完全匹配,还可以找到具有相同“来自用户”的所有房间或具有相同“到用户”的所有房间

如果您不喜欢这种方法,则需要以不同的方式构建数据库以创建简单查询

【讨论】:

  • query:$userfrom_$userto 看起来很有趣,但我不明白你是如何做到的?您是否将它们组合成一个字符串而不是爆炸?我打算在不同的节点创建房间和不同的对话
  • 是的,您可以将它们组合成一个字符串,有很多方法可以创建结构,并且每种方法都有自己的优缺点,例如,此方法仅在房间具有 1-1 关系时才有效在“to”和“from”之间,你能添加你打算使用的结构吗?
  • Frank 在上面 cmets 部分的回答似乎是我认为创建 1-1 结构的绝妙方法。谢谢
  • 是的,这似乎是一个很好的解决方案!
  • 你的方法也是了不起的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多