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;重复’,因为您将在一次通话中请求所有文档. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |