Firestore复合索引置换爆炸?

时间:2019-04-03 15:09:37

标签: c# firebase google-cloud-firestore

我正在考虑将30个约75万个文档库从mongo迁移到Google Firestore;但我遇到了复合索引问题。

我需要能够查询12个字段(即Field1 = A和Field7 = B和Field9 = C)-据我所知,每个组合都需要一个复合索引(?)< / p>

这似乎不合比例;不仅不可能以编程方式创建索引;但是排列爆炸是真实的。 每个文档都很大;下载大的子集并手动过滤不是可行的解决方案。

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

2 个答案:

答案 0 :(得分:1)

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

Field1 = A和Field2 = A

Field1 = A and Field2 = B and 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初始化并选择Firestore索引和规则,则将在当前文件夹/目录中创建一个名为firestore.indexes.json的文件,该文件还包括所有Firestore复合索引以及所有排除项。我建议备份此文件,因为如果您弄乱了任何内容,它可以用来重新创建索引。

可以将该文件添加到该命令,然后添加命令

firebase部署-仅firestore:indexes

将在文件中添加所有组合索引(将创建新的组合索引,并且可以在firebase控制台的“索引”选项卡中看到新的组合索引)。现有的将保持不变。

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

您还可以使用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个索引创建命令来进行单线程处理。

尽管只能通过ID删除复合索引,但gcloud可以用于创建复合索引,也可以用于删除复合索引。

这可以通过使用命令找到

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 --account=by@email.address --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命令类似。

答案 1 :(得分:0)

您不需要每个组合的索引,只需每个字段的索引,firestore就会根据需要将它们组合。

在此处查看有关索引合并的文档:

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