编辑:我简化了问题和示例,因为这个问题仅
一旦您开始使用即适用orderBy
.
我有一个用户集合,其中每个用户都订阅了许多变量,如下所示:
user {
var1: true,
var2: true,
var2: true,
metric: 10
}
我这样做是因为我需要查询类似的内容:
async function getUsersForVar(varId) {
const snapshot = await db.collection('users')
.where(varId, '==', true)
.get()
...
}
这工作得很好,直到我需要根据指标选择一组用户:
async function getTopUsersForVar(varId) {
const snapshot = await db.collection('users')
.where(varId, '==', true)
.orderBy('metric')
.limit(100)
.get()
...
}
当您执行此操作时,Firestore 会告诉您它需要创建一个特定于所使用的 varId 和指标的索引。但由于项目是可变的,我无法预先知道或索引每个组合。
This document https://firebase.google.com/docs/firestore/solutions/arrays描述了如何对属性进行编码以排序为键值,但对我来说这不是一个选项,因为指标会随着时间的推移而变化。
这是不可能的吗?
也许如果指标发生变化,期望数据库能够有效地执行这样的查询就太过分了。
查询返回的用户文档数量将达到数千。我可以采取什么措施来防止在客户端查询所有数据和排序?
AFAIK Firestore 将为每个查询获取完整文档。该查询将每分钟执行多次,因此如果每次执行该查询时都获取数千个用户文档,则会产生大量开销。
如果没有其他方法,我可能应该将用户的所有相关数据隔离到单独的模型/根集合中,这样就不会获取所有其他用户数据来进行此选择。
使用 Firebase 实时数据库时这会有什么不同吗?