我正在考虑将30个约75万个文档库从mongo迁移到Google Firestore;但我遇到了复合索引问题。
我需要能够查询12个字段(即Field1 = A和Field7 = B和Field9 = C)-据我所知,每个组合都需要一个复合索引(?)< / p>
这似乎不合比例;不仅不可能以编程方式创建索引;但是排列爆炸是真实的。 每个文档都很大;下载大的子集并手动过滤不是可行的解决方案。
我误解了索引还是在Firestore中根本不可能进行这些查询?
答案 0 :(得分:1)
firestore firebase 如果您尝试执行以下任何查询,则几乎肯定会遇到问题。
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就会根据需要将它们组合。
在此处查看有关索引合并的文档: