【问题标题】:Ordering Firebase posts Chronologically Swift按时间顺序快速排序 Firebase 帖子
【发布时间】:2017-10-29 21:43:00
【问题描述】:

我已将帖子添加到 firebase,我想知道如何根据用户发布帖子的时间按时间顺序拉取帖子。

我的数据库设置如下

cmets 之后的第一个节点是用户 ID,然后是帖子。显然,这些帖子是有序的,但是如果一个新用户在“posting”和“another 1”之间发布了一些东西,例如,我将如何拉它以便它显示在两者之间。

有没有办法删除 autoID 并只使用 userID 作为键?我遇到的问题是之前的帖子被覆盖了。

我接受这个答案,因为它是最彻底的。我为解决我的问题所做的只是创建唯一键作为第一个节点,然后将 UID 用作子节点,将注释用作子节点。然后我按顺序提取唯一键并找到与 uid 关联的注释。

【问题讨论】:

    标签: swift uitableview firebase firebase-realtime-database


    【解决方案1】:

    其他答案都有优点,但更完整的解决方案包括为帖子加上时间戳和denormalizing your data,以便可以查询它(假设它会在某个时候被查询)。在 Firebase 中,越扁平越好。

    posts
       post_0
         title: "Posts And Posting"
         msg: "I think there should be more posts about posting"
         by_uid: "uid_0"
         timestamp: "20171030105500"
         inv_timestamp: "-20171030105500"
         uid_time: "uid_0_ 20171030105500"
         uid_inv_time: "uid_0_-20171030105500"
    
    comments:
       comment_0
         for_post: "post_0"
         text: "Yeah, posts about posting are informative"
         by_uid: "uid_1"
         timestamp: "20171030105700"
         inv_timestamp: "-20171030105700"
         uid_time: "uid_1_20171030105700"
         uid_inv_time: "uid_1_-20171030105700"
       comment_1
         for_post: "post_0"
         text: "Noooo mooooore posts, please"
         by_uid: "uid_2"
         timestamp: "20171030110300"
         inv_timestamp: "-20171030110300"
         uid_time: "uid_2_20171030110300"
         uid_inv_time: "uid_2_-20171030110300"
    

    有了这个结构,我们可以

    get posts and their comments and order them ascending or descending
    query for all posts within the last week
    all comments or posts made by a user
    all comments or posts made by a user within a date range (tricky, huh)
    

    我在其中添加了几个其他键:值对以稍微完善一下:复合值、查询升序和降序、时间戳。

    【讨论】:

    • 当您进入comment_10 时,这可能会导致问题,字符串按字典顺序排列。所以顺序是comment_1、comment_10、comment_2等,你可以用0作为前缀,但这只会把问题推得更远:(。orderByKey()如果有帮助的话,会以正确的顺序给出唯一键吗?
    • @av4625 通常,您不会使用这样的静态注释键(c_0、c_1 等)。我将它们用作使用 .childByAutoId(-Jook9i900s、-J7h89090ks0k0 等)生成的密钥的占位符。
    • 很公平,只是想确保每个人都清楚,因为你要到第 10 号才能看到问题,然后再重新设计就更难了
    【解决方案2】:

    您不能使用 userID 而不是 autoID 作为键值,因为键必须是唯一的,这就是为什么 Firebase 只是更新值而不添加另一个具有相同键的值。通常,Firebase 节点默认按时间顺序排列,因此如果您提取这些值,这些值应该是正确的顺序。但是,如果您想确定这一点,您可以添加时间戳值并设置服务器时间戳。提取数据后,您可以按该时间戳对其进行排序(我认为实际上有一个由 firebase 自动保存的时间戳,您可以以某种方式访问​​它,但您需要在文档中查找)。如果我猜对了,为了完成你想要的,你需要改变你的数据库的结构。例如,您可以使用 autoID,但如果需要,可以将要用作键的用户 ID 保存为值。希望我的想法正确,如果不仅仅是更精确,我会尽力提供帮助。

    【讨论】:

      【解决方案3】:

      Firebase 密钥默认按时间顺序排列 - 它内置在密钥生成算法中。我认为您需要重组/重新思考您的数据。

      您的 POSTS 数据库应该(可能)在每个帖子中列出 cmets,然后如果需要用户访问,您可以在用户记录上复制以便更快地检索。所以像:

      POSTS
        - post (unique key)
          - title (text)
          - date (timestamp)
          - comments
            - comment (unique key)
              - text (text)
              - user_id (user key)
              - date (timestamp)
      

      当您拉取 cmets 时,您不应该从一群不同的用户那里拉取它们。这可能会导致大量查询和 ton 的加载时间。相反,可以将 cmets 添加(当然按时间顺序)到 post 对象本身,如果您想在那里保留引用,也可以添加到用户。与 MySQL 不同,NoSQL 数据库可以有相当多的这种数据重复。

      【讨论】:

        猜你喜欢
        • 2017-08-10
        • 2016-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 2020-10-18
        相关资源
        最近更新 更多