Firestore综合指数排列爆炸?

问题描述 投票:3回答:1

我正在考虑将30个集合,~750k文档数据库从mongo迁移到Google Firestore;但是我遇到了复合索引的问题。

有12个字段我需要能够查询ad-hoc(即Field1 = A和Field7 = B和Field9 = C) - 据我所知,我需要每个组合的复合索引(?)

这似乎没有规模;不仅不可能以编程方式创建索引;但排列爆炸是真实的。每个文件都相当大;下载大型子集并手动过滤不是一个可行的解决方案。

我是误解索引还是这些查询在Firestore中根本不可能?

c# firebase google-cloud-firestore
1个回答
1
投票

如果您正在尝试执行以下任何查询,您几乎肯定会遇到问题。

Field1 = A,Field2 = A.

要么

Field1 = A,Field2 = B,Field7 = D.

如果您尝试使用每个组合创建复合索引,则复合索引的总数为200。

但是,我的初步测试显示您可以执行以下操作。

使用Field1到Field9创建一个复合索引。

这将用于满足包含这些字段的所有搜索(只要您在.where子句列表中没有任何其他字段)。

如果您也使用order_by,则还必须符合DESCENDING或ASCENDING标准,但由于您正在查看完全匹配,因此这无关紧要。

这是有效的,因为firestore智能地使用复合索引并查找包含所有字段的索引以及它具有更多内容的事实无关紧要因为.where子句没有为这些字段指定任何特定顺序,因此现有索引可以使用。

如果你寻找索引合并(接近底部),这将解释。

https://firebase.google.com/docs/firestore/query-data/index-overview

至于以编程方式创建和删除索引,现在比去年年底更有可能。

可以使用firebase工具https://firebase.google.com/docs/cli/将现有的复合索引转储到文件中

如果执行firebase init并选择firestore索引和规则,则会导致在当前文件夹/目录中创建名为firestore.indexes.json的文件,该文件包括所有firestore组合索引和所有排除项。我建议备份这个文件,因为它可以用来重新创建索引,如果你弄乱任何东西。

可以将此文件添加到命令中

firebase部署--only firestore:索引

将在文件中添加所有复合索引(将构建新的复合索引,并可在索引选项卡中的firebase控制台中构建)。现有的将不受影响。

这不会更改200个复合索引的限制。 .where子句列表中还包含100个字段,包括order_by字段。

您还可以使用gcloud SDK删除索引。请查看以下页面以获取相关说明。

https://cloud.google.com/sdk/install

确保在安装选项列表中选择beta。

这是了解gcloud选项的良好入门者

https://cloud.google.com/sdk/gcloud/reference/

以下页面介绍了如何创建索引。

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 |              |

要获取Name值,请运行以下命令

gcloud beta firestore索引复合列表--format =“value(name)” - filter =“FIELD_PATHS:Field1”

这将提供一个复合索引名称列表,然后可以使用它来输入删除命令,其中索引包含字段名称“Field1”。

可以使用以上删除命令使用上述命令列出的名称(本例中为CICAgJjUt4gK)进行删除

gcloud -q [email protected] --project = proj-a73464 beta firestore索引复合删除CICAgJjUt4gK

其中--account是针对firebase项目注册的电子邮件地址, - project名称是项目名称,-q表示安静。这些选项必须位于命令的开头。

索引的删除速度比创建速度快得多,因此如果您不断刷新Firestore控制台组合索引视图,您应该会看到计数下降。

要创建索引使用

gcloud beta firestore索引复合创建--collection-group = COLLECTION_GROUP --field-config = FIELD_CONFIG [--async] [GCLOUD_WIDE_FLAG ...]

创造。查找此命令的选项,但它们与delete命令类似。

© www.soinside.com 2019 - 2024. All rights reserved.