为什么这个 firestore 查询需要索引?

问题描述 投票:0回答:2

我有一个带有

where()
方法和相等运算符的查询,然后是
orderBy()
方法,我不明白为什么它需要索引。 where 方法检查对象(映射)中的值,并且 order by 是一个数字。

文档说

如果您有一个带有范围比较的过滤器(<, <=, >,>=),您的第一个排序必须位于同一字段

所以我认为相等过滤器就可以了。

这是我的查询代码:

this.afs.collection('posts').ref
.where('tags.' + this.courseID,'==',true)
.orderBy("votes")
.limit(5)
.get().then(snap => {
  snap.forEach(doc => {
    console.log(doc.data());
  });
});

这是数据库结构的示例 enter image description here

javascript firebase google-cloud-firestore angularfire2
2个回答
109
投票

为什么此 Firestore 查询需要索引?

您可能已经注意到,Cloud Firestore 中的查询速度非常快,这是因为 Firestore 会自动为文档中的任何字段创建索引。因此,当您简单地使用范围比较进行过滤时,Firestore 会自动创建所需的索引。如果您还尝试对结果进行排序,则需要另一个索引。这种索引“不是”自动创建的。您应该自己创建它。这可以通过在您的 Firebase Console 中手动创建来完成,或者您会在日志中找到如下消息:

FAILED_PRECONDITION:查询需要索引。您可以在这里创建它:...

您只需单击该链接或将 URL 复制并粘贴到网络浏览器中,您的索引就会自动创建。

因此 Firestore 需要索引,以便您可以进行非常快速的查询。


10
投票
propertyX

字段以及它们的值是什么,已排序(它们已排序这一事实至关重要)。

如果此清单不存在,要查询 

propertyX

someValue
的文档,机器必须迭代整个集合以确定 (1) 哪些文档包含
propertyX
以及 (2) 哪些文档包含
propertyX
等于
someValue
。通过保留查询属性的索引,当对
propertyX
执行查询时,机器可以直接转到
propertyX
索引并收集所有等于
someValue
的文档的位置,然后从集合中获取这些文档并归还它们。机器不仅不需要接触集合来知道文档在哪里,而且甚至不需要迭代整个索引,因为它总是有序的。
索引是集合大小对 Firestore 查询的性能没有影响的原因,也是我们只需要对曾经查询过的属性建立索引的原因。

© www.soinside.com 2019 - 2024. All rights reserved.