为什么此 firestore 查询需要索引?
Why does this firestore query require an index?
我有一个查询,其中包含一个带有相等运算符的 where()
方法,然后是一个 orderBy()
方法,但我不明白为什么它需要索引。
where 方法检查对象(地图)中的值,排序依据是数字。
文档说
If you have a filter with a range comparison (<, <=, >, >=), your first ordering must be on the same field
所以我认为相等过滤器会很好。
这是我的查询代码:
this.afs.collection('posts').ref
.where('tags.' + this.courseID,'==',true)
.orderBy("votes")
.limit(5)
.get().then(snap => {
snap.forEach(doc => {
console.log(doc.data());
});
});
这里是数据库结构的例子
Why does this Firestore query require an index?
您可能已经注意到,Cloud Firestore 中的查询非常快,这是因为 Firestore 会自动为文档中的任何字段创建索引。因此,当您简单地使用范围比较进行过滤时,Firestore 会自动创建所需的索引。如果您还尝试对结果进行排序,则需要另一个索引。这种索引不是自动创建的。你应该自己创建它。这可以通过在您的 Firebase Console 中手动创建它来完成,或者您会在日志中找到一条听起来像这样的消息:
FAILED_PRECONDITION: The query requires an index. You can create it here: ...
您只需单击 link 或将 URL 复制并粘贴到网络浏览器中,系统就会自动创建您的索引。
因此 Firestore 需要一个索引,以便您可以进行非常快速的查询。
索引只是一个数据库目录或什么在哪里的记录。每个索引都是特定事物的特定清单——例如,集合中存在多少 propertyX
个字段以及它们的值是什么,已排序(它们已排序的事实很关键)。
如果此清单不存在,要查询 propertyX
为 someValue
的文档,机器将必须遍历整个集合以确定 (1) 哪些文档包含 propertyX
和 (2) 哪些文档包含 propertyX
等于 someValue
。通过保留查询属性的清单(或索引),当对 propertyX
执行查询时,机器可以直接转到 propertyX
索引并收集所有等于 [=12] 的文档的位置=] 然后从集合中获取这些文档并 return 它们。机器不仅不需要接触集合来知道文档在哪里,甚至不需要遍历整个索引,因为它总是有序的。
索引是集合大小对 Firestore 查询的性能没有影响的原因,也是我们只需要索引曾经查询过的属性的原因。
我有一个查询,其中包含一个带有相等运算符的 where()
方法,然后是一个 orderBy()
方法,但我不明白为什么它需要索引。
where 方法检查对象(地图)中的值,排序依据是数字。
文档说
If you have a filter with a range comparison (<, <=, >, >=), your first ordering must be on the same field
所以我认为相等过滤器会很好。
这是我的查询代码:
this.afs.collection('posts').ref
.where('tags.' + this.courseID,'==',true)
.orderBy("votes")
.limit(5)
.get().then(snap => {
snap.forEach(doc => {
console.log(doc.data());
});
});
这里是数据库结构的例子
Why does this Firestore query require an index?
您可能已经注意到,Cloud Firestore 中的查询非常快,这是因为 Firestore 会自动为文档中的任何字段创建索引。因此,当您简单地使用范围比较进行过滤时,Firestore 会自动创建所需的索引。如果您还尝试对结果进行排序,则需要另一个索引。这种索引不是自动创建的。你应该自己创建它。这可以通过在您的 Firebase Console 中手动创建它来完成,或者您会在日志中找到一条听起来像这样的消息:
FAILED_PRECONDITION: The query requires an index. You can create it here: ...
您只需单击 link 或将 URL 复制并粘贴到网络浏览器中,系统就会自动创建您的索引。
因此 Firestore 需要一个索引,以便您可以进行非常快速的查询。
索引只是一个数据库目录或什么在哪里的记录。每个索引都是特定事物的特定清单——例如,集合中存在多少 propertyX
个字段以及它们的值是什么,已排序(它们已排序的事实很关键)。
如果此清单不存在,要查询 propertyX
为 someValue
的文档,机器将必须遍历整个集合以确定 (1) 哪些文档包含 propertyX
和 (2) 哪些文档包含 propertyX
等于 someValue
。通过保留查询属性的清单(或索引),当对 propertyX
执行查询时,机器可以直接转到 propertyX
索引并收集所有等于 [=12] 的文档的位置=] 然后从集合中获取这些文档并 return 它们。机器不仅不需要接触集合来知道文档在哪里,甚至不需要遍历整个索引,因为它总是有序的。
索引是集合大小对 Firestore 查询的性能没有影响的原因,也是我们只需要索引曾经查询过的属性的原因。