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

时间:2018-12-15 06:37:01

标签: javascript firebase google-cloud-firestore angularfire2

我有一个使用相等运算符的where()方法和一个orderBy()方法的查询,但我不知道为什么它需要索引。 where方法检查对象(地图)中的值,并且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

非常感谢

2 个答案:

答案 0 :(得分:1)

  

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

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

FAILED_PRECONDITION: The query requires an index. You can create it here: ...

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

因此Firestore需要索引,这样您才能进行非常快速的查询。

答案 1 :(得分:0)

索引只是数据库清单(对于Firestore,是集合清单)。每个索引都是特定事物(财产)的特定清单。例如,如果您没有这样的清单,则要执行一个查询,其中somePropertysomeValue,则机器将必须遍历整个集合以确定哪些文档具有该属性以及它们的属性是什么。值是。通过保留属性清单,当您执行相同的查询时,计算机将直接进入清单,从而无需遍历整个集合。这部分是为什么Firestore查询如此之快,为什么集合的大小对查询性能没有影响以及为什么只需要对可查询的属性建立索引的原因。