我有两个Firestore集合,Users
和Posts
。以下是每个文档中包含的典型文档的简化示例。
*请注意,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查询,因此我不能仅将所有朋友链接在一起。即使可以,对于只有少数几个朋友的人来说,这似乎也不是一种最佳方法。
我能想到的唯一选择是为每个朋友创建一个单独的查询。但是,这有几个问题。首先是挑战(以一种流畅的方式)呈现许多异步获取的结果。第二个原因是,每次更新一个查询快照(即实时更新)时,如果不在客户端上手动对集合进行手动排序,就无法将数据合并到时间顺序中。
是否可以构建我正在描述的查询,还是我不得不采用这种不尽人意的方法?这似乎是一个相当普遍的查询用例,所以如果没有一种方法可以使我感到惊讶。
答案 0 :(得分:2)
按时间顺序排序很容易,只要您使用的是Unix时间戳,例如1547608677790
使用.orderBy
方法。但是,这使您有大量潜在的查询要迭代(每个朋友一个)。
所以,我认为您想重新考虑数据存储架构。
利用Cloud Functions for Firebase Triggers。撰写新帖子时,请使用云功能来计算应该看到谁。每个用户都可以具有包含所有unread-posts
,read-posts
等的数组类型属性。
这样的事情会很快而且省事。