我试图了解 Firestore 如何在字段上创建索引。给定以下示例文档,如何创建索引,特别是对于映射/数组?
我多次阅读了 Cloud Firestore 中的索引类型 中的文档,但我仍然不确定。那里写着:
自动索引 默认情况下,Cloud Firestore 自动为文档中的每个字段和映射中的每个子字段维护单字段索引。 Cloud Firestore 对单字段索引使用以下默认设置:
对于每个非数组和非映射字段,Cloud Firestore 定义了两个集合范围的单字段索引,一个采用升序模式,一个采用降序模式。
对于每个映射字段,Cloud Firestore 都会为映射中的每个非数组和非映射子字段创建一个集合范围升序索引和一个降序索引。
对于文档中的每个数组字段,Cloud Firestore 创建并维护一个集合范围数组包含索引。
默认情况下不维护具有集合组范围的单字段索引。
如果我理解正确的话,那么就会为每个字段创建一个索引,即使是
alternate_names
数组中的值也是如此。
因此,如果我想搜索
fields.alternate_names
包含值(例如)“草房”的任何文档,那么 Firestore 将使用索引进行搜索
我的假设/理解正确吗?
不,你的理解不正确。
fields.alternate_names
是map字段中的数组子字段,这意味着它不能满足第二点的要求。 您只需发出查询即可测试您的假设。 如果查询失败,您将在错误消息中看到由于缺少索引而失败。
Firestore 根本不允许未索引的查询。 该失败的错误消息将包含一个指向控制台的链接,如果可能的话,您可以通过该链接创建该查询所需的索引。
如果您希望能够查询
fields.alternate_names
的内容,请考虑将其提升为自己的顶级字段,默认情况下该字段将被索引。
自从提出并回答这个问题以来,文档已发生变化,行为也发生了变化:
自动索引 默认情况下,Cloud Firestore 自动为文档中的每个字段和映射中的每个子字段维护单字段索引。 Cloud Firestore 对单字段索引使用以下默认设置:
对于每个非数组和非映射字段,Cloud Firestore 定义两个集合范围单字段索引,一个采用升序模式,一个采用降序模式。
对于每个地图字段,Cloud Firestore 都会创建以下内容:
- 每个非数组、非映射子字段有一个集合范围的升序索引。
- 每个非数组、非映射子字段有一个集合范围降序索引。
- 一个集合范围数组包含每个数组子字段的索引。
- Cloud Firestore 递归地索引每个地图子字段。
对于文档中的每个数组字段,Cloud Firestore 创建并维护一个集合范围数组包含索引。
默认情况下不维护具有集合组范围的单字段索引。
截至撰写本文时,Firestore 递归地索引子字段。 这意味着,原始示例字段
fields.alternate_names
将被索引。
您可以在 Firebase 控制台中对此进行测试。 创建一个新文档,并添加嵌套字段。 然后查询该字段并查看结果。
但是,当通过控制台查询时,您会注意到嵌套字段可能不会出现。您必须手动输入它。