swift – Firestore:如何在集合中获取随机文档

前端之家收集整理的这篇文章主要介绍了swift – Firestore:如何在集合中获取随机文档前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对于我的应用程序来说,能够从firebase中的集合中随机选择多个文档至关重要.

由于Firebase(我知道)没有内置本机功能来实现这样做的查询,我首先想到的是使用查询游标来选择随机的开始和结束索引,前提是我有多少文档集合.

这种方法只能以有限的方式运作,因为每个文件都会按照其相邻文件的顺序提供;但是,如果我能够通过其父集合中的索引选择文档,我可以实现随机文档查询,但问题是我找不到任何描述如何执行此操作的文档,或者即使您可以执行此操作.

这是我希望能够做到的,请考虑以下firestore架构:

root/
  posts/
     docA
     docB
     docC
     docD

然后在我的客户端(我在Swift环境中)我想编写一个可以执行此操作的查询

db.collection("posts")[0,1,3] // would return: docA,docB,docD

无论如何我能做到这一点吗?或者,有不同的方式我可以以类似的方式选择随机文档吗?

请帮忙.

文档ID不可知版本

编写文档时,首先生成一个随机的64位整数,并将其添加为一个名为random的字段.

这将创建一个索引,随机排序您的文档.

现在,要选择随机文档,请生成另一个随机64位整数.我们将在查询中使用它来选择索引中的随机位置并读取下一个文档:

let postsRef = db.collection("posts")
queryRef = postsRef.whereField("random",isGreaterThan: random)
                   .order(by: "random")
                   .limit(to: 1)

检查这是否已返回文档.如果没有,请反转方向并再试一次:

queryRef = postsRef.whereField("random",isLessThanOrEqualTo: random)
                   .order(by: "random",descending: true)
                   .limit(to: 1)

自动Id版本

如果您使用我们的客户端库中提供的随机生成自动ID,您可以使用同一系统随机选择文档.

在此系统中,生成要在查询中使用的新自动ID.现在,选择集合中大于新自动ID的文档(限制1).

与不可知版本略有不同的是,您目前无法按降序排序文档ID.这意味着如果您的查询未返回文档,则需要生成新的自动ID,然后重试.

多个随机

通常,您希望一次选择多个随机文档.根据您想要的权衡取舍,有两种不同的方法来调整上述技术.

冲洗&重复

这种方法很简单.只需重复此过程,包括每次选择一个新的随机整数.

方法将为您提供随机的文档序列,而无需担心重复查看相同的模式.

权衡是它将比下一个方法慢,因为它需要为每个文档单独往返服务.

坚持下去

在这种方法中,只需将限制数量增加到所需文档即可.它有点复杂,因为您可能会在调用中返回0..limit文档.然后,您需要以相同的方式获取丢失的文档,但限制仅限于差异.如果您知道总共有多个文档而不是您要求的数字,那么您可以忽略永远无法获得足够文档的边缘情况.

与该解决方案的权衡是重复的顺序.虽然文档是随机排序的,但如果您最终重叠范围,您将看到之前看到的相同模式.尽管如此,有两种方法可以缓解这种担忧.首先,插入的文档将最终编织在中间,逐渐改变序列.其次,您可以通过在每次更新时使用新数字更新随机字段来加速这一过程.

这种方法比’Rinse& amp;重复’,因为您将在一次通话中请求所有文档.

猜你在找的Swift相关文章