Firestore复合索引排列爆炸?

2024-03-04

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

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

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

我是否误解了索引,或者这些查询在 Firestore 中根本不可能实现?


火库 /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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firestore复合索引排列爆炸? 的相关文章

  • 如何在 C++ 中对四元结构进行有效排序?

    我有一个包含 x y z 和 w 成员的结构 如何高效排序 在 C 中首先按 x 然后按 y 按 z 最后按 w 如果你想实现字典排序 那么最简单的方法是使用std tie实现小于或大于比较运算符或函子 然后使用std sort http
  • 使用 strcpy 从整数生成指针,无需进行强制转换

    我不明白我做错了什么 我正在学习 C 很抱歉 如果这显然是错误的 但我正在尝试使用uthash http uthash sourceforge net 制作股票及其价格的哈希图 但是当我将股票添加到哈希映射时 我收到上述错误 我所做的就是从
  • 如何让BackgroundWorker返回一个对象

    我需要做RunWorkerAsync 返回一个List
  • .NET:EventHandler 竞争条件修复如何工作?

    以下模式用于在引发事件时避免竞争条件 以防另一个线程取消订阅 MyEvent 使其为空 class MyClass public event EventHandler MyEvent public void F EventHandler h
  • 如何正确实现带有 close 方法的处置模式(CA1063)

    框架设计指南 第二版 第 327 页 说 考虑提供方法Close 除了Dispose 如果接近 是该领域的标准术语 这样做时 重要的是使 Close 实现与Dispose并考虑实施IDisposable Dispose方法明确 因此 按照提
  • 如何有效地左填充字节数组

    假设我有一个数组 LogoDataBy byte 0x00000008 0x00000000 0x41 0x00000001 0x42 0x00000002 0x43 0x00000003 0x44 0x00000004 0x31 0x00
  • 如何在Qt3D中优化点云渲染

    我正在尝试使用 Qt3D 显示大型点云 20M pts 我第一次发现这个图书馆https github com MASKOR Qt3DPointcloudRenderer https github com MASKOR Qt3DPointc
  • 起订量工作单元

    我是单元测试的新手 我想为我的搜索功能创建一个测试 我的服务层看起来像 public class EmployeeService BaseService IEmployeeService public EmployeeService IUn
  • 如何修复 TcpClient Ip 标头错误校验和

    我正在使用 System Net Sockets TcpClient 类 但每当我通过网络发送自定义数据包时 我都会在wireshark捕获上看到错误的校验和 我该如何修复它 问题是您在网络接口上设置了校验和卸载 这会导致您的网卡计算校验和
  • “已经有一个与此命令关联的打开的 DataReader,必须先将其关闭。”

    我正在开发需要连接到另一个数据库以获取一些数据的应用程序 为此 我决定使用 SqlConnection reader 等 我需要执行一些查询 例如首先我需要获取某个用户的卡 ID 之后我需要通过该卡 ID 获取一些数据 这是我的代码 reg
  • C 风格强制转换与内在强制转换

    假设我已经定义了 m256d x我想提取低 128 位 我会做 m128d xlow mm256 castpd256 pd128 x 然而 我最近看到有人这样做 m128d xlow m128d x 是否有用于演员的首选方法 为什么要用第一
  • gcc 删除内联汇编代码

    看起来 gcc 4 6 2 删除了它认为函数中未使用的代码 test c int main void goto exit handler asm volatile jmp 0x0 exit return 0 拆解main 0x0804840
  • 使用 OpenSSL 库在 C++ 中生成 SHA 哈希值

    如何使用以下命令生成 SHA1 或 SHA2 哈希值OpenSSL https openssl org图书馆 我搜索了谷歌 找不到任何函数或示例代码 从命令行来看 很简单 printf compute sha1 openssl sha1 您
  • 为什么C++中没有“NULL引用”?

    我正在阅读 C 常见问题解答 8 6 什么时候应该使用引用 什么时候应该使用指针 http www parashift com c faq lite refs vs ptrs html 特别是以下声明 可以时使用引用 必要时使用指针 上述情
  • 如何使用 HttpClient 验证 Pardot API

    我花了大约一天的时间尝试对 Pardot API 进行身份验证 它不喜欢我尝试发布消息正文的方式 所以我想发布对我有用的解决方案 如果您有任何建议或替代方案 我想听听 ServicePointManager SecurityProtocol
  • Sharepoint 的 CAML 查询中的日期时间比较

    我正在尝试从共享点列表中获取某些项目 具体取决于自定义列中的日期 我已经使用 U2U Caml Builder 创建了查询 这很有效 但是当我将其放入 Web 部件中自己的代码中时 它总是返回列表中的所有项目 这是我的代码 DateTime
  • 使用客户端 hello 消息进行 TLS 协议检测

    我需要检测网络流量中的 https 数据包 到目前为止 我将所有 443 标记为 https 但我不想再在这种情况下使用端口信息 检查客户端问候消息是否足够 Check 22 and version info 0300 0301 or 03
  • 错误:C# 尝试读取或写入受保护的内存

    我很难纠正这个错误 该应用程序在 4 台不同的机器上进行了测试 在其中 3 台上运行良好 但一台 Vista PC 在尝试通过 WebBrowser1 打开页面时出现此错误 解决这个问题的任何帮助对我都会非常有帮助 System Acces
  • 在 C# 中设置风扇速度

    我知道以前有人问过这个问题 但我似乎无法让它发挥作用 我已调用以下内容 using System Management using System Management Instrumentation using System Runtime
  • 如何在 C# 中将 json 转换为平面结构

    我正在尝试用 C 编写函数 将 JSON 转换为键 值对 它应该支持数组 例如下面的 JSON title title value components component id id1 menu title menu title1 tit

随机推荐

  • emberjs 如何禁用 Ember.Select?

    我有一个与这个问题类似的问题 Emberjs 禁用和启用 TextField https stackoverflow com questions 10523780 emberjs disable and enable textfield 所
  • 如何安全地为 Perl 5.8.9 编译 Perl 5.12 模块?

    我想在我的 Perl 5 8 9 中安装 File Fetch 它是 Perl 5 12 中的核心模块 一般来说 我想在回溯的 Perl 中编译和安装未来的模块 因为我无法升级我的 Perl 所以我下载了该模块及其依赖项 遵循依赖关系树是相
  • 在 django 中建立一对多关系

    我正在尝试在 django 中建立一对多关系 在我的模型中 我有一个 Person 类和一个 Group 类 我想要建立的关系是一个 Group 内部可以有 N 个人 并且一个 Group 不能在没有至少一个人的情况下存在 在 MER 图中
  • 将 Cython 中的 numpy 数组传递给需要动态分配数组的 C 函数

    我有一些具有以下声明的 C 代码 int myfunc int m int n const double a double b double c So a是一个常量二维数组 b是一个二维数组 并且c是一个一维数组 全部动态分配 b and
  • 抛出 VS 重新抛出:结果相同吗?

    参考网上的很多文档 特别是关于SO的文档 例如 在 C 中重新引发异常的正确方法是什么 https stackoverflow com questions 178456 what is the proper way to re throw
  • 使用剃刀时关闭WebFormViewEngine?

    我下载了Glimpse http www getglimpse com 今天早上尝试一下 当我单击 视图 选项卡时注意到这一点 它检查所有加载的视图引擎 我发现在哪里RazorViewEngine在 web config 中指定 但我找不到
  • 如何在收到 fetch POST 请求的响应后将用户重定向到页面?

    我正在为一个 Web 应用程序编写代码 该应用程序使用 javascript 的 fetch api 向 node js 服务器发送 POST 请求 成功请求后 服务器会进行重定向响应 该重定向 URL 将在 fetch api 响应正文中
  • 谷歌智能锁与凭证管理 API

    我想为我的网络应用程序实现无摩擦登录过程 经过一番搜索 我发现有两种解决方案 谷歌智能锁 https developers google com identity one tap web get started 凭证管理API https
  • 如何将 bin 文件(512 字节)写入软盘的第一个扇区(扇区 0)?

    如何将 bin 文件写入软盘 虚拟软盘 软盘映像的第一个扇区 我正在尝试启动一个简单的 512 字节引导加载程序 到处都显示 512 字节 的大小 所以我应该已经很好了 附加信息 引导加载程序仅显示一个字符串 我正在学习simple集会 有
  • 使用 UnityContainer 中的接口注册类型

    我正在使用 UnityContainer 并且我想注册一个接口 而不是使用类型 而是使用另一个接口 不幸的是 我无法干净地做到这一点 我有几个常用的接口 它们统一在一个接口中 我需要将它们注册到容器中 代码如下 interface IDev
  • iPhone清除CGContext

    我用这段代码创建了一个带有漂亮阴影的圆圈 我在 iPhone 上使用 MonoTouch net Objective C 答案当然很好 UIGraphics PushContext ctx SizeF shadowSize new Size
  • 过滤罗盘读数

    我正在使用罗盘标题来旋转 MKMapView 旋转有点不稳定 所以我试图像 iPhone 上的 Google 地图一样过滤它 或者似乎做了一些欺骗 我正在尝试使用移动平均公式过滤 iPhone 指南针的读数 但它在 359 和 0 之间的交
  • Android 服务被杀死

    我有一个服务与我的应用程序在同一进程中运行 有时 Android 操作系统决定终止我的服务 可能是由于内存不足 我的问题是 我的应用程序是否会与服务一起被杀死 或者它到底是如何工作的 Thanks 首先请务必阅读 http develope
  • 使用声明和 AntiforgeryToken 的 MVC 5 OWIN 登录。我是否错过了 ClaimsIdentity 提供商?

    我正在尝试学习 MVC 5 OWIN 登录的声明 我尝试让它尽可能简单 我从 MVC 模板开始并插入我的声明代码 见下文 当我在视图中使用 Html AntiForgeryToken 帮助程序时 出现错误 Error A claim of
  • 格式化 xml 字符串的好代码

    有人有一个现成的函数可以接受 XML 字符串并返回正确缩进的字符串吗 eg
  • 在模拟器中运行的 React Native 给出捆绑失败:权限被拒绝错误

    我刚刚创建了一个项目react native init在 Manjaro Linux 上并使用 Android Studio 打开它 然后我跑了react native start在终端上运行该应用程序 然后在现有的模拟器上运行该应用程序
  • C++ std::set 比较器

    这是代码 struct comp bool operator Reputation one Reputation two if one gt Amount lt 0 two gt Amount gt 0 return false if on
  • JMeter - 根据平均响应时间测试失败

    我正在使用性能插件在 Jenkins 中运行 JMeter 作业 如果平均响应时间 这是我尝试添加 BeanSehll Listener 和 Assertion 的方法 Recording Controller Home Page Bean
  • 配置多个命令在 VS Code 任务中并行运行(编译和自动添加 Sass 前缀)

    我之前一直使用 Koala 通过自动前缀和缩小 在 Windows 上 来编译我的 Sass 但发现 Koala 不再被维护 因此 我试图弄清楚人们通常如何编译 Sass 自动添加前缀并在保存时自动缩小它 我对 Gulp 这样的命令行工具不
  • Firestore复合索引排列爆炸?

    我正在考虑将 30 个集合 约 75 万文档数据库从 mongo 迁移到 Google Firestore 但我遇到了复合索引的问题 我需要能够临时查询 12 个字段 即 Field1 A 和 Field7 B 和 Field9 C 据我所