Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 如何查询Firestore集合中字段值包含在列表中的文档_Firebase_Google Cloud Firestore - Fatal编程技术网

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

Firebase 如何查询Firestore集合中字段值包含在列表中的文档,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,我有两个Firestore集合,用户和帖子。下面是每个文档中典型文档所包含内容的简化示例 *请注意,friends子集合中的文档ID等于相应用户文档的文档ID。或者,我还可以将uid字段添加到friends文档和/或Users文档中。还有一个与此问题无关的原因是,我们将朋友作为每个用户的子集合,但如果需要,我们将其更改为统一的根级别朋友集合 通过这种设置,只要查找posts文档,其owner字段等于该用户的文档引用,就可以很容易地查询任何给定用户按时间顺序排序的帖子 尽管我们正在为iOS、An

我有两个Firestore集合,
用户
帖子
。下面是每个文档中典型文档所包含内容的简化示例

*请注意,
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个字符。我不确定我是否在听你的评论。如果用户可能会看到无限数量的帖子,那么数组就不是一个好的解决方案。可以将其放入子集合中。