火库 /questions/tagged/firestore firebase /questions/tagged/firebase如果您尝试执行以下任何查询,您几乎肯定会遇到问题。 [更新] 请参阅本文末尾,了解 2019 年 11 月起提供的一些新选项。
字段 1=A 且字段 2=A
or
字段 1=A 且字段 2=B 且字段 7=D
因为复合索引的总数为 200,如果您尝试使用其中的每个组合创建复合索引。
但是,我的初步测试表明您可以执行以下操作。
创建一个包含Field1到Field9的复合索引。
这将用于满足包含这些字段的所有搜索(只要 .where 子句列表中没有任何其他字段)。
如果您也使用 order_by,您还必须匹配 DESCENDING 或 ASCENDING 标准,但由于您正在查看完全匹配,因此这应该不重要。
这是有效的,因为 firestore 智能地使用复合索引,并查找包含所有字段的索引,事实上它包含更多字段并不重要,因为 .where 子句没有为这些字段指定任何特定顺序,因此现有索引可以使用。
如果您寻找索引合并(靠近底部),则会对此进行解释。
https://firebase.google.com/docs/firestore/query-data/index-overview https://firebase.google.com/docs/firestore/query-data/index-overview
至于以编程方式创建和删除索引,现在比去年年底更有可能。
可以使用 firebase 工具将现有的复合索引转储到文件中https://firebase.google.com/docs/cli/ https://firebase.google.com/docs/cli/
如果您执行 firebase init 并选择 firestore 索引和规则,那么这将导致在当前文件夹/目录中创建一个名为 firestore.indexes.json 的文件,其中包括所有 firestore 复合索引和所有排除项。我建议备份这个文件,因为如果你搞砸了任何事情,它可以用来重新创建索引。
这个文件可以添加到然后命令
firebase部署——仅firestore:索引
将在文件中添加所有复合索引(将构建新的索引,并且可以在索引选项卡的 firebase 控制台中看到构建)。现有的将保持不变。
这不会改变 200 个复合索引的限制。 .where 子句列表中也有 100 个字段的限制,包括 order_by 字段。
您还可以使用 gcloud SDK 删除索引。请参阅下页的说明。
https://cloud.google.com/sdk/install https://cloud.google.com/sdk/install
确保您选择beta在安装选项列表中。
这是了解 gcloud 选项的良好入门指南
https://cloud.google.com/sdk/gcloud/reference/ https://cloud.google.com/sdk/gcloud/reference/
下页介绍了如何创建索引。
https://cloud.google.com/sdk/gcloud/reference/beta/firestore/indexes/composite/create https://cloud.google.com/sdk/gcloud/reference/beta/firestore/indexes/composite/create
举个例子,
gcloud beta firestore indexes composite create \
--collection-group=Events \
--field-config field-path=tags,array-config=contains \
--field-config field-path=user_id,order=descending \
--field-config field-path=timestamp,order=descending
请参阅参考资料以了解更多可以使用的标志。
请注意,运行此命令将锁定命令行,直到索引创建完成,这可能需要 5 或 10 分钟甚至更长时间。
如果您需要添加大量索引,最好将其作为每个索引的后台命令运行,这样您就不会单线程执行 100 个索引创建命令。
然后,gcloud 可用于创建复合索引,也可用于删除复合索引,尽管它们只能通过 ID 删除。
这可以通过使用命令找到
gcloud beta firestore 索引复合列表
+--------------+---------------------+-------------+-------+------------------------------+------------+--------------+
| NAME | COLLECTION_GROUP | QUERY_SCOPE | STATE | FIELD_PATHS | ORDER | ARRAY_CONFIG |
+--------------+---------------------+-------------+-------+------------------------------+------------+--------------+
| CICAgJjUt4gK | MyCollection | COLLECTION | READY | fieldStatus | ASCENDING | |
| | | | | lastupdatedTimestamp | DESCENDING | |
要获取名称值,请运行以下命令
gcloud beta firestore 索引复合列表 --format="value(name)" --filter="FIELD_PATHS:Field1"
这将提供复合索引名称的列表,然后可以将其用于输入删除命令,其中索引包含“Field1”的字段名称。
可以使用上述命令列出的名称(本例中为 CICAgJjUt4gK)使用以下删除命令来完成删除
gcloud-q[电子邮件受保护] /cdn-cgi/l/email-protection--project=proj-a73464 beta firestore索引复合删除CICAgJjUt4gK
其中 --account 是针对 firebase 项目注册的电子邮件地址,--project name 是您的项目名称,-q 表示安静。这些选项必须位于命令的开头。
索引的删除速度比创建速度快得多,因此如果您不断刷新 firestore 控制台复合索引视图,您应该会看到计数下降。
要创建索引,请使用
gcloud beta firestore索引composite create --collection-group=COLLECTION_GROUP --field-config=FIELD_CONFIG [--async] [GCLOUD_WIDE_FLAG …]
为了创作。查找此命令的选项,但它们与删除命令类似。
[2019 年 11 月更新]
Firestore 现在允许使用“IN”和“array-contains-any”。它们中的任何一个都限制为 10 个值,因此无法满足 OP 所需的 12 个值,但可以满足状态值可以是 5 个值之一等的许多要求。
该博客讨论了新功能。
https://firebase.googleblog.com/2019/11/cloud-firestore-now-supports-in-queries.html https://firebase.googleblog.com/2019/11/cloud-firestore-now-supports-in-queries.html