如何根据子项密钥的值有效地进行查询?

时间:2016-11-24 16:02:00

标签: firebase firebase-realtime-database

我的数据库中有以下结构:

MessagesInvolvingUserID:
  - [UserID01]:
    - [MessageID01]: [TimeStamp01]
    - [MessageID02]: [TimeStamp02]
    ...
  - [UserID02]:
    - [MessageID03]: [TimeStamp03]
    - [MessageID04]: [TimeStamp04]
    ...

我想知道如何有效地构建表示每个UserID的最新messageID(基于时间戳值)的字典?

我认为"蛮力"方法可行:

  1. 观察MessagesInvolvingUserID的值
  2. 遍历每个快照,过滤最新的消息ID
  3. 构建词典
  4. 但这似乎非常低效,因为这涉及下载和做客户端工作。有什么建议可以采用更优雅的方法吗?

2 个答案:

答案 0 :(得分:1)

为什么不在具有时间戳值的每条消息下创建时间戳键,然后查询按时间戳排序的消息?您使用什么语言来查询数据库中的项目?你尝试过类似的东西吗?

ref.child(“MessagesInvolvingUserID”).child(userID).child("MessageID01").queryOrderedByChild("timestamp").observeEventType(.ChildAdded, withBlock: { snapshot in ...

答案 1 :(得分:0)

如果您想要一个显示每个用户的最新时间戳的列表,您应该存储一个列表,显示数据库中每个用户的最新时间戳。

LatestTimstampForUserID:
  - [UserID01]: [TimeStamp02]
  - [UserID02]: [TimeStamp04]
    ...

现在,您可以非常有效地从数据库中读取此数据并显示列表。

成本是,在为用户发布新消息时,您需要更新数据库中的多个位置。这在使用NoSQL数据库时非常常见,例如Firebase实时数据库。