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

时间:2019-01-16 02:12:07

标签: firebase google-cloud-firestore

我有两个Firestore集合,UsersPosts。以下是每个文档中包含的典型文档的简化示例。

enter image description here *请注意,friends子集合中的文档ID等于相应用户文档的文档ID。 (可选)我也可以在uid文档和/或friends文档中添加Users字段。同样,有一个与这个问题无关的原因是我们将friends作为每个用户的子集合,但是如果需要,我们可以将其更改为统一的根级别Friends集合。

通过此设置,只需查找Posts字段等于该用户的文档引用的owner个文档,即可轻松查询任何给定用户按时间顺序排序的帖子。

尽管我们正在为iOS,Android,网络构建此应用,但我还是通过以下方式在iOS / Swift中实现了这一目标。

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)
  

我的问题是如何查询Posts文档,这些文档在用户的owner子集合中包含friends值,并按时间顺序排序。换句话说,如何获取按时间顺序排序的属于用户朋友的帖子。

以一个真实世界的示例为例,在Twitter上,给定用户的提要由所有具有所有者属性的推文填充,这些推特具有按时间顺序排序的所有者属性,其值包含在用户的以下列表中。

现在,我从the documentation知道Firestore不支持逻辑OR查询,因此我不能仅将所有朋友链接在一起。即使可以,对于只有少数几个朋友的人来说,这似乎也不是一种最佳方法。

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

是否可以构建我正在描述的查询,还是我不得不采用这种不尽人意的方法?这似乎是一个相当普遍的查询用例,所以如果没有一种方法可以使我感到惊讶。

1 个答案:

答案 0 :(得分:2)

按时间顺序排序很容易,只要您使用的是Unix时间戳,例如1547608677790使用.orderBy方法。但是,这使您有大量潜在的查询要迭代(每个朋友一个)。

所以,我认为您想重新考虑数据存储架构。

利用Cloud Functions for Firebase Triggers。撰写新帖子时,请使用云功能来计算应该看到谁。每个用户都可以具有包含所有unread-postsread-posts等的数组类型属性。

这样的事情会很快而且省事。