获取数组等于任何数组元素排序字段- Swift - Firestore



我需要在一个集合中创建一个Firestore查询:

  1. 按字段"时间戳"排序
  2. 字段">
  3. 等于字符串数组(大于10)中的任何一个元素
  4. 我需要分页查询,以便我能够执行更多的查询从一个精确的时间戳

代码应该是这样的:

Firestore.firestore()
.where(field: "uid", in: arrayOfUids)
.order(by: "timestamp", descending: false)
.limit(to: 5)

或者从一个特定的时间戳

开始
Firestore.firestore()
.where(field: "uid", in: arrayOfUids)
.startAt("timestmap", lastTimestampFetched)
.order(by: "timestamp", descending: false)
.limit(to: 5)

我怎样才能达到这个结果?在这个主题中,建议在每次调用中执行多个调用过滤,其中数组中最多有10个元素(Firestore能够比较的最大数组元素数),但我没有按时间戳排序的约束。

编辑:我不能在客户端订购查询结果,这对我的用例没有帮助。假设我们有30个uid要查询:首先,我们必须把这些液体分成10个一组。

所以我们将有3组10个uid(最大数组长度查询与Firestore);对于每个组,我们将执行一个单独的查询,如下所示:

Firestore.firestore()
.where(field: "uid", in: arrayOfTenUids)
.startAt("timestmap", lastTimestampFetched)
.order(by: "timestamp", descending: false)
.limit(to: 5)

对于每个查询,我们保存最后一个文档时间戳,以便能够执行带分页的连续查询。

这里是问题,我们将有多个最后的时间戳,因为我们正在执行多个查询,我们要保存哪个时间戳?

第一个选项:所有最后时间戳中的最后一个时间戳

第二个选项:所有最后时间戳中的第一个时间戳

第一例->在后续查询中,我们将获取一些先前已获取的文档

第二种情况->在连续的查询中,我们将错过之前已经获取的一些文档(因为一个查询的最后一个时间戳可能在另一个查询的最后一个时间戳之后)

这个题目很难解释,但是我已经尽力了。

根据这些评论,让我尝试创建当前Firestore结构并重新陈述目标,然后提出解决方案。我暂时忽略时间戳:

Posts (collection)
post_0
uid: uid_4
post_1:
uid: uid_1
post_2:
uid: uid_3
post_3:
uid: uid_2

Matches (collection)
uid_0
uid_1
uid_2
uid_3
uid_5
uid_4

目标是让当前用户(例如uid_0)在Matches集合中读取其节点,即

uid_0
uid_1
uid_2
uid_3

,然后从uid字段与该列表中的uid匹配的Post节点中获取帖子。结果应为post_1, post_2和post_3。

问题是用户节点,uid_0,可以有几十个子uid,因为Firestore一次只能匹配最多10个使用'in'函数

.where(field: "uid", in: arrayOfUids)

将需要多次读取-然后是时间戳和排序以及分页的问题。

我的建议是简化;如果上述目标是正确的,那么就不要为每个帖子存储那些不同的uid,而只存储当前用户的uid,如下所示

Posts (collection)
post_0
uid: uid_2
post_1:
uid: uid_0
post_2:
uid: uid_0
post_3:
uid: uid_0

然后在Posts节点中查询uid = uid_0。结果将是完全相同的,更容易实现和维护,然后时间戳/分页问题不再是一个问题。

显然这是一个简单的例子;我想您希望在每个帖子中存储多个uid,这样无论哪个登录的用户都可以检索他们选择的帖子。为此,使用array contains来检索与该用户匹配的帖子。

Posts (collection)
post_0
uid_array: 
uid_2
uid_9
uid_21

最新更新