查询界面概览
本页面介绍了可用于访问原生模式 Firestore 数据库中数据的不同接口。
操作接口
原生模式支持两种用于访问数据的接口:
流水线操作
Firestore 的较新查询接口。 流水线操作支持基于阶段的可组合语法。您可以通过定义一系列按顺序执行的连续阶段来构建操作。这样一来,您就可以执行复杂的运算,例如对汇总结果进行过滤,而这在原始接口(核心操作)中是不可能实现的。
流水线操作仅在 Firestore 企业版中提供,并且处于预览版发布阶段。
核心操作
核心操作是 Firestore 的原始接口。核心操作对文档或集合引用使用方法链式语法(.where()、.orderBy()、.get())来检索文档。查询阶段的顺序是隐含的,并且汇总支持有限。
核心操作在企业版和标准版中均可用,但不同版本之间的索引默认值差异很大。有关详情,请参见下文。
版本之间的接口差异
随着企业版中引入原生模式支持,Firestore 核心操作与流水线操作均可使用。在企业版中使用核心操作时,新的索引编制行为和定价模式消除了标准版的许多限制。
| 功能 | 标准版 | 企业版 |
| 支持的操作 | 仅限 Firestore 核心操作。 | 支持 Firestore 核心操作和流水线操作,以及 Firestore MongoDB 兼容性操作。 |
| 索引编制要求 | 所有查询都需要索引。 | 查询不需要索引。 |
| 创建索引 | 系统会为单个字段创建自动索引。您可以手动创建复合索引。 | 系统不会创建任何自动索引。这些索引需要手动管理。 |
| 已编入索引的字段 | 如果索引字段中尚不存在 __name__ 字段,系统会自动将其附加到索引字段中。 | __name__ 不会自动附加到已编入索引的字段。如果 __name__ 对您的应用很重要,您需要在编入索引的字段中明确指定它。 |
| 排序顺序归一化 | 通过在末尾附加不等式字段和 __name__ 字段(如果尚不存在),对查询的 order by 子句进行归一化处理。这样可保证结果的排序是唯一的、确定的,无论 order by 子句中包含哪些其他字段。 | 不进行排序顺序归一化。排序顺序(例如 sort a ASC)仅保证结果按字段 a 排序。Firestore 将使用现有索引,以尽可能高效的顺序返回结果。因此,如果 a 在结果集中不是唯一的,则结果的顺序可能会因查询而异,具体取决于索引配置、执行策略等。为了保证结果的唯一确定性排序,您需要向排序顺序添加唯一字段,例如 __name__。 |
| 查询性能和费用 | 由于有索引要求,查询通常具有良好的性能表现。 | 通过创建索引来优化查询性能和费用。您可以使用“查询解释”和“查询洞察”来识别缺失的索引。 随着数据集不断增长,无索引的查询可能会性能下降且成本上升,因此需要持续监控与优化。 |
| 索引开销费用 | 索引写入不收费,因为索引是自动的。 | 当写入关联文档时,写入索引条目会消耗写入单位(索引条目每 1 KiB 消耗 1 个写入单位)。由于无需为每个字段创建索引条目,因此可节省存储费用。 |
| 结算模式(读取/写入/删除) | 按文档读取、写入和删除操作收费。 | 按每次读取和写入(分批)收费。读取费用以读取单位计费(每 4 KiB 为一批次)。写入和删除操作会合并计入写入单位(按 1 KiB 为批次)。 |
| 基本价格(每百万次)
所示定价适用于 us-central1 区域 |
读取:每 10 万个文档 $0.03(每 100 万个文档 $0.30)。 写入:每 10 万个文档 $0.09(每 100 万个文档 $0.90)。 删除:每 10 万个文档 $0.01(每百万个文档 $0.10) |
读取单位:每 100 万个读取单位 $0.05。 写入单位:每 100 万个写入单位 $0.26。与标准读取费用相比,当文档大小小于 4KiB 时,价格通常会更低。 |
| 实时更新
所示定价适用于 us-central1 区域 |
实时更新按读取计费,费率为每 10 万个文档 $0.03。 | 实时更新具有新的独立 SKU(实时更新单位),按每 4 KiB 为一批次计费。实时更新的费用为每 100 万个读取单位 $0.30。 |