代码之家  ›  专栏  ›  技术社区  ›  willbattel

如何查询字段值包含在列表中的文档的Firestore集合

  •  0
  • willbattel  · 技术社区  · 6 年前

    我有两个Firestore收藏, Users Posts . 下面是每个文档中典型文档所包含内容的简化示例。

    enter image description here *注意,在 friends 子集合等于相应用户文档的文档ID。或者,我也可以添加 uid 字段到 朋友 文件和/或 用户 文件。另外,我们有一个与这个问题无关的原因 朋友 作为每个用户的子集合,但如果需要,我们将其更改为统一的根级别 Friends 收藏。

    这个设置使得查询按时间顺序排列的帖子变得非常容易,只要简单地查找 帖子 文件 owner 字段等于该用户的文档引用。

    我在iOS/Swift中实现了这一点,尽管我们正在为iOS、Android构建这个应用程序, 网状物。

    guard let uid = Auth.auth().currentUser?.uid else {
        print("No UID")
        return
    }
    let firestoreUserRef = firestore.collection("Users").document(uid)
    firestorePostsQuery = firestore.collection("Posts").whereField("owner", isEqualTo: firestoreUserRef).order(by: "timestamp", descending: true).limit(to: 25)
    

    我的问题是如何提问 帖子 主人 用户的 朋友 子集合,按时间顺序排序。换句话说,如何获得属于用户朋友的帖子,按时间顺序排序。

    对于一个真实的例子,考虑Twitter,在Twitter中,给定用户的feed由具有owner属性的所有tweets填充,owner属性的值包含在用户的下一个列表中,按时间顺序排序。

    现在,我从 the documentation Firestore不支持逻辑或查询,所以我不能把所有的朋友都链接在一起。即使我可以,对于那些朋友不多的人来说,这似乎不是一个最佳的方法。

    我能想到的唯一选择是为每个朋友创建一个单独的查询。不过,这有几个问题。第一个挑战是(以平滑的方式)呈现许多异步获取的结果。第二个原因是,每次更新一个查询快照(即实时更新)时,如果不在客户机上手动重新排序集合,我就无法将数据合并为按时间顺序排列的数据。

    是否可以构建我正在描述的查询,或者我必须采用这种不太理想的方法?这似乎是一个相当常见的查询用例,因此如果没有方法这样做,我会感到惊讶。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Ronnie Smith    6 年前

    如果使用的是Unix时间戳,则按时间顺序排序很容易,例如。 1547608677790 使用 .orderBy 方法。但是,这会给您留下一大堆需要迭代的查询(每个朋友一个)。

    所以,我认为您需要重新考虑数据存储模式。

    利用 Cloud Functions for Firebase Triggers . 当一篇新文章被写出来时,有一个云函数计算谁都应该看到它。每个用户都可以有一个包含所有 unread-posts , read-posts 等等。

    这样的事情会很快而且最少。