我有一个动态构造的Firestore查询,如下所示:
let db = firebase.firestore().collection('vehData')
if (this.filters.model.selected) {
db = db.where('Model', '==', this.filters.model.selected)
}
if (this.filters.condition.selected) {
db = db.where('TitleStatus', '==', this.filters.condition.selected)
}
if (this.filters.year.selected) {
db = db.where('Year', '==', this.filters.year.selected)
}
if (this.filters.autopilot.selected) {
db = db.where('Autopilot', '==', this.filters.autopilot.selected)
}
if (this.filters.battery.selected) {
db = db.where('Battery', '==', this.filters.battery.selected)
}
if (this.filters.sortBy.selected) {
db = db.orderBy(this.filters.sortBy.selected, this.filters.sortBy.ascOrDesc)
}
db.limit(200).get().then((querySnapshot) => { ... })
this.filters
只是一组选择输入的数据模型。
但是,问题是Firebase坚持为上述查询的每个单个变体都设置了复合索引设置,例如:
Model ASC TitleStatus ASC
或Model ASC TitleStatus ASC Year ASC
或Model ASC TitleStatus ASC Year ASC Autopilot ASC
为每种情况/过滤器的可能组合创建索引显然不是一种选择,有人能获得有关如何克服此限制的提示吗?
答案 0 :(得分:0)
在Firestore中没有用于创建必要索引的解决方法。 Firestore可以大规模扩展的唯一方法是要求每个查询都使用索引。
如果您不喜欢通过单击错误消息中的链接来手动创建每个索引的过程,则可以构造一个Firebase CLI部署的Firestore规则文件。可以编写一些代码来自动计算和填充文件。一旦完成,您将不再需要手动创建索引,而只需使用CLI一次部署规则。
使用CLI初始化新的项目空间时,告诉它要初始化Firestore,它将生成一个基本的json文件供您修改和部署。通常,您会将Firebase CLI项目文件检入源代码管理。
答案 1 :(得分:0)
我创建了一个脚本来通过JavaScript遍历查询的所有可能变体,因为索引以JSON表示,所以一旦我掌握了排列查询的逻辑,就可以创建一个简化的流程。