作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于我的应用程序来说,能够从 firebase 的集合中随机选择多个文档至关重要。
由于 Firebase 中没有内置的 native 函数(我知道)来实现这样的查询,我的第一个想法是使用查询游标来选择一个随机的开始和结束索引,前提是我有文档的数量集合。
这种方法可以工作,但只能以有限的方式工作,因为每次都将按顺序提供每个文档及其相邻文档;但是,如果我能够通过其父集合中的索引选择文档,我可以实现随机文档查询,但问题是我找不到任何描述如何执行此操作或即使您可以执行此操作的文档。
这是我希望能够做的事情,请考虑以下 Firestore 架构:
root/
posts/
docA
docB
docC
docD
db.collection("posts")[0, 1, 3] // would return: docA, docB, docD
最佳答案
使用随机生成的索引和简单查询,您可以从 Cloud Firestore 的集合或集合组中随机选择文档。
这个答案分为 4 个部分,每个部分都有不同的选项:
__name__
字段,后面提到的“低值”是一个空字符串。这是迄今为止生成随机索引的最简单方法,并且不受语言和平台的影响。
__name__
) 仅按升序索引,并且您也无法重命名现有文档,除非删除和重新创建。如果您需要其中任何一个,您仍然可以使用此方法并将自动 ID 存储为名为
random
的实际字段,而不是为此目的重载文档名称。
random
的字段。根据您期望的文档数量,您可以使用不同的有界范围来节省空间或降低冲突风险(这会降低此技术的有效性)。
random
表示。我们将使用这个值在索引上找到一个随机点。
let postsRef = db.collection("posts")
queryRef = postsRef.whereField("random", isGreaterThanOrEqualTo: random)
.order(by: "random")
.limit(to: 1)
lowValue
就是
0
:
let postsRef = db.collection("posts")
queryRef = postsRef.whereField("random", isGreaterThanOrEqualTo: lowValue)
.order(by: "random")
.limit(to: 1)
>=
和
<=
之间随机选择,这将不公平屏蔽值的概率降低了一半,代价是索引存储量增加一倍。
queryRef = postsRef.whereField("random", isLessThanOrEqualTo: random)
.order(by: "random", descending: true)
.limit(to: 1)
queryRef = postsRef.whereField("random", isGreaterThanOrEqualTo: random)
.order(by: "random")
.limit(to: 1)
0..limit
文档。然后您需要以相同的方式获取丢失的文档,但限制减少到只有差异。如果您知道文档总数比您要求的数量多,您可以通过忽略在第二次调用(但不是第一次调用)时永远无法取回足够文档的边缘情况进行优化。
random
设为包含子字段 1 到 3 的映射:
{'random': {'1': 32456, '2':3904515723, '3': 766958445}}
random
字段的随机值。这将在随机索引中移动文档。
if random(0,100) === 0) update;
)。
关于swift - Firestore : How to get random documents in a collection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46798981/
我是一名优秀的程序员,十分优秀!