Firebase Firestore — 是什么,文档和 NoSQL 集合

作者: IT Sectr 发布日期: 2026-04-28 阅读时间: 10 分钟

Firebase Firestore 是 Google 提供的一种灵活的 NoSQL 文档数据库,可为移动和 Web 应用提供自动实时同步。数据以集合和文档的形式存储,每个文档包含一组任意结构的字段。根据 Google 2026 年数据,Firestore 支持多区域复制和故障自动恢复。SDK 通过 WebSocket 连接将更改发送到服务器,延迟低于 100 毫秒。

要点

  • Firestore — 支持查询、索引和事务的 NoSQL 文档数据库。
  • 数据同步通过 WebSocket 以实时方式工作 — 服务器上的更改立即传递给所有客户端。
  • Firestore 支持离线模式 — 数据本地缓存,连接恢复后同步。
  • 无需配置分片或复制即可自动扩展至数百万并发连接。
  • Security Rules 安全规则允许无需服务器代码即可管理数据访问。

什么是 Firebase Firestore

Firebase Firestore 是 Google 于 2019 年推出的云端 NoSQL 数据库,是 Realtime Database 的继任者。Firestore 构建在 Google Cloud Spanner 和 Google Cloud Datastore 的基础架构之上,在单个事务内提供严格的数据一致性以及自动多区域复制。SDK 支持 Android、iOS、Web (JavaScript)、Flutter、Kotlin Multiplatform 和 Unity。

从 Realtime Database 的演进

Firestore 在 Google I/O 2017 上作为 “Cloud Firestore” 发布 — 该解决方案消除了 Realtime Database 的关键限制:缺乏对复杂查询的支持、无法在多个节点上扩展数据以及弱一致性。根据 Google (2026) 的数据,Firestore 每天处理超过 1 万亿次查询,并且是 80% 的新 Firebase 项目的默认数据库。然而,Realtime Database 由于其简单的 JSON 结构,在超低延迟场景(游戏、协同编辑)中仍然具有相关性。

Firestore 的免费限制

Firestore 采用即用即付模式提供,Spark 套餐具有慷慨的免费限制:1 GB 存储、每月 10 GB 网络流量、每天 5 万次读取操作、2 万次写入操作和 2 万次删除操作。在 Blaze 套餐中,所有内容同样免费,超出部分按量计费:每 10 万次读取操作 $0.06,每 10 万次写入操作 $0.18。根据 Google (2026) 的数据,90% 的项目未超出免费限制。

数据模型:集合、文档和字段

Firestore 的数据模型采用分层组织:根目录包含集合,每个集合包含文档,每个文档包含字段(原始类型、数组、Map)和子集合(subcollections)。集合的嵌套深度没有限制,但一个文档不能直接包含另一个文档 — 只能通过引用(Reference type)来实现。

集合和文档

集合是文档的容器,具有自动生成或指定的标识符。每个文档是一个类似 JSON 的对象,大小最大为 1 MiB。文档字段可以是字符串、数字、布尔值、数组、Map、时间戳(Timestamp)、地理点(GeoPoint)和对其他文档的引用(Reference)。文档大小限制为 1 MiB,包括所有字段名称。

Firestore 字段类型示例可索引
String“user@example.com”
Number42, 3.14
Booleantrue, false
Array[1, 2, 3]仅 contains
Map{“嵌套”: “值”}是(按键)
Timestamp2026-07-03T12:00:00Z
Referenceusers/user123

批量写入和事务

Firestore 支持数据库级别的原子事务。事务可以读取和写入多个文档 — Commit 原子地应用所有更改或不应用任何更改。每个事务最多 500 个操作,超时 60 秒。批量写入(batch write)是一种无读取阶段的非事务性原子写入操作。事务对于金融操作、座位预订和库存管理至关重要。

Firestore 与 Realtime Database 对比

在 Firestore 和 Realtime Database 之间的选择取决于项目需求。两种数据库都属于 Firebase 生态系统,提供实时同步,并在所有平台上可用,但在数据模型、扩展性和定价方面存在根本差异。

主要区别

Realtime Database 将数据存储在单个 JSON 树中,这对于简单结构很方便,但在嵌套深度超过 3 层时会使扩展变得困难。Firestore 使用集合-文档模型,具有自动分片功能,可在不影响性能的情况下扩展到数百万个文档。根据 Google (2026) 的数据,Firestore 支持单个集合多达 1 万个并发连接而不会损失速度,Realtime Database 支持单个实例多达 20 万个连接。

定价

Realtime Database 根据传输的数据量(下载的字节数)和并发连接数计费。Firestore — 根据操作数(读取、写入、删除)计费。对于频繁进行小规模更新的应用(聊天、通知),Firestore 通常更具成本效益 — 每次写入操作都有固定价格,与数据大小无关。对于不频繁读取大量数据的应用,Realtime Database 可能更便宜。

Google (2026) 建议:将 Firestore 用作新项目的默认数据库,将 Realtime Database 用于游戏和延迟要求极低(低于 50 毫秒)且数据结构扁平的应用。两种数据库可以在同一个项目中同时运行。

Firestore 中的查询、索引和分页

Firestore 查询在集合或集合组上执行,带有过滤、排序和限制。与 Realtime Database(每个查询都是在客户端使用过滤器遍历整个 JSON 树)不同,Firestore 在服务器上使用预先创建的索引执行所有查询。这保证了查询的复杂度仅取决于结果的大小,而不是集合的大小。

查询类型

Firestore 支持基于一个或多个字段的过滤(equality、range、in、array-contains、array-contains-any)、升序和降序排序、限制以及用于分页的游标。限制:对不同字段进行过滤的组合查询(where price > 10 AND where category == “books”)需要组合索引;禁止 OR 查询(使用 in 和 array-contains-any 代替)以及禁止对不同字段进行不等式查询。

kotlin
data class Product(
    val name: String = "",
    val category: String = "",
    val price: Double = 0.0,
    val inStock: Boolean = false
)

suspend fun FirestoreRepository.queryProducts(): List<Product> {
    return firestore
        .collection("products")
        .whereEqualTo("category", "electronics")
        .whereGreaterThanOrEqualTo("price", 100.0)
        .whereLessThan("price", 500.0)
        .orderBy("price")
        .limit(20)
        .get()
        .await()
        .toObjects(Product::class.java)
}

自动索引和组合索引

Firestore 自动为单个字段创建索引 — 基于单个字段的查询无需任何配置即可运行。对于具有两个或更多字段的查询(过滤 + 排序),会创建组合索引。首次发送查询时,Firestore 会返回一个错误,其中包含指向控制台的链接,只需单击一下即可创建索引。每个数据库最多 200 个组合索引。索引可以通过 firebase CLI 导出和导入。

Firestore 在 Android 中的集成

将 Firestore 连接到 Android 应用通过 Firebase BOM 标准完成。添加 firebase-firestore-ktx 依赖项后,FirebaseFirestore 对象可通过 getInstance() 获取 — 无需额外的密钥或令牌。Firestore 使用与其他服务相同的 Firebase 项目。

groovy
dependencies {
    implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
    implementation("com.google.firebase:firebase-firestore-ktx")
}

// 初始化
val db = FirebaseFirestore.getInstance()

读取和写入数据

Firestore 提供两种读取模式:一次性读取(get)和实时读取(addSnapshotListener)。一次性读取获取文档一次 — 适用于设置和配置。监听器订阅更改 — 文档的任何更新都会自动将更新后的数据实时传递给所有已连接的客户端。set() 创建或覆盖文档,update() 仅更改指定字段而不覆盖整个文档。

根据 Google (2026) 的数据,使用实时 Firestore 的中型应用(10 万 DAU)每月消耗约 5-10 GB 的出站流量。使用离线缓存(Persistence Cache)可将重复下载量减少 60-70%,因为 SDK 在连接恢复后仅下载更改过的文档。

离线模式

Persistence Cache 是 Firestore 的内置机制,用于在无网络情况下工作。SDK 自动将读取的所有文档缓存在设备上(Android 上最多 500 MiB)。断开连接时,读取从缓存继续,写入排入队列。连接恢复后,所有延迟操作发送到服务器,缓存与服务器同步。对于冲突控制,使用 snapshot-metadata.hasPendingWrites 和 setOptions(ServerTimestampBehavior)。

安全规则和数据验证

Security Rules 是一种声明性语言,用于限制对 Firestore 的访问,在每次读取或写入操作之前由 Google 服务器执行。Rules 不需要服务器代码 — 在 Firebase 控制台或通过 firebase CLI 编写,并通过 Git 进行版本控制。每个操作都会检查是否符合规则,如果违反,将返回 PERMISSION_DENIED 错误。

规则结构

Firestore Security Rules 规则由 match 块和 allow 表达式组成。match 定义到集合或文档的路径,allow 指定允许的操作(read、write、create、update、delete)和条件 — 返回布尔值的类似 JavaScript 的表达式。规则可以检查身份验证(request.auth)、请求数据(request.resource.data)、现有数据(resource.data)、时间(request.time)和路径(request.path)。

javascript
rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read: if request.auth != null;
      allow write: if request.auth.uid == userId;
    }

    match /products/{productId} {
      allow read: if true;
      allow create: if request.auth.token.role == "admin";
      allow update: if resource.data.authorId == request.auth.uid;
    }
  }
}

数据验证

Security Rules 支持服务器端的类型和值验证。如果价格为负或名称为空,可以禁止写入。所有检查在写入前由 Google 服务器执行 — 这保证了数据的一致性,与客户端(Android、iOS、Web、Admin SDK)无关。Rules 不能防御恶意的 Admin SDK — 它按照定义绕过规则。要获得完整保护,请使用 Transaction Functions 和 Firebase Extensions。

常见问题

Firestore 和 Realtime Database 有什么区别?

Firestore 使用带有索引和复杂查询的文档模型。Realtime Database 将数据存储在 JSON 树中,提供更低的延迟。建议将 Firestore 用于新项目。

Firestore 如何扩展?

Firestore 自动按集合分片数据 — 无需配置复制或分片。数据库可以承受集合中的数百万个文档和数千个并发连接而不会降级。

可以将数据从 Realtime Database 迁移到 Firestore 吗?

可以,使用 Firebase Console — “Export to Firestore” 功能可将 Realtime Database 的 JSON 结构转换为 Firestore 集合和文档,只需几次点击。嵌套节点成为嵌套集合。

Firestore 如何处理离线写入冲突?

Last write wins — 默认情况下,Firestore 使用 “最后一次写入获胜” 策略来解决并发写入时的冲突。对于自定义处理,请使用带重新读取的事务。

Firestore 提供多少免费存储空间?

免费限制 Spark 套餐:1 GB 存储、每天 5 万次读取操作和 2 万次写入操作。这对于 MVP 和轻负载应用来说足够了。

总结

  • Firebase Firestore — Google 的 NoSQL 文档数据库,具有实时同步和自动扩展功能。
  • 数据模型:集合 → 文档 → 字段(String、Number、Boolean、Array、Map、Timestamp、Reference、GeoPoint)。
  • 支持具有过滤、排序、分页和组合索引的组合查询,用于复杂条件。
  • 离线模式在设备上缓存最多 500 MiB 数据,连接恢复后自动同步。
  • Security Rules — 服务器端访问权限语言,无需编写后端代码即可验证类型和值。
  • 多区域复制,自动故障恢复 — 即使数据中心宕机,数据仍然可用。
  • 建议用于新项目作为默认数据库,Realtime Database 用于游戏和超低延迟场景。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读