Firebase 如何查询Firestore集合中字段值包含在列表中的文档
我有两个Firestore集合,Firebase 如何查询Firestore集合中字段值包含在列表中的文档,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,我有两个Firestore集合,用户和帖子。下面是每个文档中典型文档所包含内容的简化示例 *请注意,friends子集合中的文档ID等于相应用户文档的文档ID。或者,我还可以将uid字段添加到friends文档和/或Users文档中。还有一个与此问题无关的原因是,我们将朋友作为每个用户的子集合,但如果需要,我们将其更改为统一的根级别朋友集合 通过这种设置,只要查找posts文档,其owner字段等于该用户的文档引用,就可以很容易地查询任何给定用户按时间顺序排序的帖子 尽管我们正在为iOS、An
用户
和帖子
。下面是每个文档中典型文档所包含内容的简化示例
*请注意,friends
子集合中的文档ID等于相应用户文档的文档ID。或者,我还可以将uid
字段添加到friends
文档和/或Users
文档中。还有一个与此问题无关的原因是,我们将朋友
作为每个用户的子集合,但如果需要,我们将其更改为统一的根级别朋友
集合
通过这种设置,只要查找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)
我的问题是如何查询帖子
文档,这些文档的所有者
值包含在用户的好友
子集合中,并按时间顺序排序。换句话说,如何获得属于用户朋友的帖子,按时间顺序排序
对于真实世界的例子,考虑推特,在给定的用户的feed中,所有的tWET都有一个所有者属性,该值包含在用户的下一个列表中,按时间顺序排序。 现在,我知道Firestore不支持逻辑或查询,所以我不能将所有的朋友链接在一起。即使我可以,对于那些拥有一小群朋友的人来说,这似乎不是一个最佳的方法
我能想到的唯一选择是为每个朋友创建一个单独的查询。然而,这有几个问题。第一个挑战是(以平滑的方式)呈现许多异步获取的结果。第二个问题是,每次更新一个查询快照(即实时更新)时,如果不在客户端上手动重新排序集合,我无法将数据按时间顺序合并是否有可能构建我正在描述的查询,或者我将不得不采用这种不太理想的方法?这似乎是一个相当常见的查询用例,因此如果没有办法做到这一点,我会感到惊讶。如果您使用的是Unix时间戳,则按时间顺序排序很容易,例如使用该方法的
1547608677790
。然而,这就给您留下了一大堆需要迭代的查询(每个朋友一个)
因此,我认为您需要重新考虑数据存储模式
利用。写一篇新文章时,让一个云函数计算谁都应该看到它。每个用户都可以有一个数组类型属性,其中包含所有未读帖子
,已读帖子
,等等
这样做既快捷又省力。您不能在一个查询中完成这项工作。您将不得不在某个地方进行迭代,并进行多个查询,以收集所需的所有信息,正如您已经发现的那样。@DougStevenson我担心可能会出现这种情况。任何一个拥有超过几个朋友的用户都会很倒霉。我认为我根本不能走这条路,因为我必须一次又一次地进行查询、排序和重新排序。没有一种方法可以重组我的数据以使其更可行,是吗?执行多个查询并不是一个真正的问题。最大的问题是你阅读文档的数量。这是限制因素。只要你没有读到比实际需要更多的文档,你就做得很好。@DougStevenson即使有大量的查询不是问题,它仍然会产生你提到的关于读取文档数量的问题。如果我有200个查询,每个朋友一个,那么我需要阅读至少200个文档——事实上要多得多,以确保我能够按时间顺序显示。现在我正在获取数千个文档,而我只想显示最近的10个文档。这不是很有效。如果您需要限制读取的文档数量,那么只能通过对Firestore中的单个集合进行单个查询来实现。Firestore并不是每项工作的最佳解决方案,因此,欢迎其他可能满足您的查询需要的替代方案。这是有道理的,但我认为我不能使用数组类型属性,因为Firestore施加了文档大小限制。但是,我想我可以在每个Post文档上部署与子集合相同的概念,其中子集合中的每个文档都对应于应该能够看到Post的用户。
文档
的最大大小与字段值
相同,也就是说,如果数组太小,文档也是如此。看见注:500页文本等于1兆字节(字段大小限制),或1000000个字符。我不确定我是否在听你的评论。如果用户可能会看到无限数量的帖子,那么数组就不是一个好的解决方案。可以将其放入子集合中。