Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么此firestore查询需要索引?_Javascript_Firebase_Google Cloud Firestore_Angularfire2 - Fatal编程技术网

Javascript 为什么此firestore查询需要索引?

Javascript 为什么此firestore查询需要索引?,javascript,firebase,google-cloud-firestore,angularfire2,Javascript,Firebase,Google Cloud Firestore,Angularfire2,我有一个带有等式运算符的where()方法的查询,然后是一个orderBy()方法,我不明白为什么它需要索引。 where方法检查对象(映射)中的值,orderby是一个数字 文件上说 如果您有一个带范围比较(=)的筛选器,则您的第一次排序必须在同一字段上 所以我认为一个平等过滤器就可以了 这是我的查询代码: this.afs.collection('posts').ref .where('tags.' + this.courseID,'==',true) .orderBy("votes") .

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

文件上说

如果您有一个带范围比较(=)的筛选器,则您的第一次排序必须在同一字段上

所以我认为一个平等过滤器就可以了

这是我的查询代码:

this.afs.collection('posts').ref
.where('tags.' + this.courseID,'==',true)
.orderBy("votes")
.limit(5)
.get().then(snap => {
  snap.forEach(doc => {
    console.log(doc.data());
  });
});
下面是数据库结构的一个示例

为什么此firestore查询需要索引

正如您可能注意到的,云Firestore中的查询速度非常快,这是因为Firestore会自动为您文档中的任何字段创建索引。因此,当您仅使用范围比较进行筛选时,Firestore会自动创建所需的索引。如果您还试图对结果排序,则需要另一个索引。这种索引不是自动创建的。你应该自己创造它。这可以通过在您的日志中手动创建来完成,或者您可以在日志中找到一条类似以下内容的消息:

FAILED_PRECONDITION: The query requires an index. You can create it here: ...
您只需单击该链接,或将url复制粘贴到web浏览器中,您的索引将自动创建


因此Firestore需要一个索引,这样您就可以进行非常快速的查询。

索引只是一个数据库清单或一个位置记录。每个索引都是特定事物的特定清单,例如,集合中存在多少
propertyX
字段,它们的值是什么,已排序(排序的事实至关重要)

如果此清单不存在,要查询
propertyX
someValue
的文档,机器必须遍历整个集合,以确定(1)哪些文档包含
propertyX
,以及(2)哪些文档包含
propertyX
等于
someValue
。通过保存查询属性的清单(或索引),当对
propertyX
执行查询时,机器可以直接进入
propertyX
索引,收集所有等于
someValue
的文档的位置,然后从集合中提取这些文档并返回它们。机器不仅不需要触摸集合就知道文档在哪里,甚至不需要遍历整个索引,因为它总是有序的


索引是集合大小对Firestore查询性能没有影响的原因,也是我们只需要为曾经查询过的属性编制索引的原因。

正如Alex回答的那样:Firestore会自动为每个字段创建索引。但是您的查询需要在
“标记”.+this.courseID
投票上使用复合索引,这不是自动创建的。请注意,您可以通过以下方式简化查询。除了更简单之外,这可能不需要额外的索引。@FrankvanPuffelen伟大的思考
array contains
确实需要索引,但只需要一个索引,而我需要为每个相等的courseID创建一个新索引。谢谢但是,如果集合不断更新,并且不断添加新文档,会发生什么情况呢?我需要一次又一次地重建索引吗?或者,一旦我建立了索引(目前集合中只有5个文档,用于测试/开发),它将在以后的生产模式中自动扩展它以容纳更多文档?@Devashish创建索引后,无需做任何事情。它可以处理任意数量的文档。