获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

Cloud Firestore 数据模型

Cloud Firestore 是一个 NoSQL、面向文档的数据库。与 SQL 数据库不同,没有表或行。相反,您将数据存储在文档中,这些文档被组织成集合

每个文档都包含一组键值对。 Cloud Firestore 针对存储大量小文档进行了优化。

所有文档都必须存储在集合中。文档可以包含子集合和嵌套对象,它们都可以包含像字符串这样的原始字段或像列表这样的复杂对象。

集合和文档是在 Cloud Firestore 中隐式创建的。只需将数据分配给集合中的文档。如果集合或文档不存在,Cloud Firestore 会创建它。

文件

在 Cloud Firestore 中,存储单位是文档。文档是包含映射到值的字段的轻量级记录。每个文档都由一个名称标识。

代表用户alovelace的文档可能如下所示:

  • 情书

    first : "Ada"
    last : "Lovelace"
    born : 1815

文档中复杂的嵌套对象称为映射。例如,您可以使用地图构造上面示例中的用户名,如下所示:

  • 情书

    name :
    first : "Ada"
    last : "Lovelace"
    born : 1815

您可能会注意到文档看起来很像 JSON。事实上,他们基本上是。存在一些差异(例如,文档支持额外的数据类型并且大小限制为 1 MB),但通常,您可以将文档视为轻量级 JSON 记录。

收藏品

文档存在于集合中,集合只是文档的容器。例如,您可以有一个users集合来包含您的各种用户,每个用户都由一个文档表示:

  • 用户

    • 情书

      first : "Ada"
      last : "Lovelace"
      born : 1815

    • first : "Alan"
      last : "Turing"
      born : 1912

Cloud Firestore 是无架构的,因此您可以完全自由地选择在每个文档中放置哪些字段以及在这些字段中存储哪些数据类型。同一集合中的文档都可以包含不同的字段或在这些字段中存储不同类型的数据。但是,最好在多个文档中使用相同的字段和数据类型,这样您就可以更轻松地查询文档。

集合包含文档,仅包含其他内容。它不能直接包含带值的原始字段,也不能包含其他集合。 (有关如何在 Cloud Firestore 中构建更复杂数据的说明,请参阅分层数据。)

集合中的文档名称是唯一的。您可以提供自己的密钥,例如用户 ID,也可以让 Cloud Firestore 自动为您创建随机 ID。

您不需要“创建”或“删除”集合。在集合中创建第一个文档后,集合就存在了。如果您删除集合中的所有文档,则它不再存在。

参考

Cloud Firestore 中的每个文档都由其在数据库中的位置唯一标识。前面的示例显示了集合users中的文档alovelace 。要在代码中引用此位置,您可以创建对它的引用

Web version 9

import { doc } from "firebase/firestore";

const alovelaceDocumentRef = doc(db, 'users', 'alovelace');

Web version 8

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
迅速
注意:此产品不适用于 watchOS 和 App Clip 目标。
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective-C
注意:此产品不适用于 watchOS 和 App Clip 目标。
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];

Java

DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");

Kotlin+KTX

val alovelaceDocumentRef = db.collection("users").document("alovelace")

Dart

final alovelaceDocumentRef = db.collection("users").doc("alovelace");
爪哇
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
Python
a_lovelace_ref = db.collection(u'users').document(u'alovelace')

Python

a_lovelace_ref = db.collection("users").document("alovelace")
C++
DocumentReference alovelace_document_reference =
    db->Collection("users").Document("alovelace");
节点.js
const alovelaceDocumentRef = db.collection('users').doc('alovelace');
alovelaceRef := client.Collection("users").Doc("alovelace")
PHP

PHP

有关安装和创建 Cloud Firestore 客户端的更多信息,请参阅Cloud Firestore 客户端库

$document = $db->collection('samples/php/users')->document('alovelace');
统一
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#

C#

有关安装和创建 Cloud Firestore 客户端的更多信息,请参阅Cloud Firestore 客户端库

DocumentReference documentRef = db.Collection("users").Document("alovelace");
红宝石
document_ref = firestore.col("users").doc("alovelace")

引用是一个轻量级对象,它只指向数据库中的一个位置。无论数据是否存在,您都可以创建引用,并且创建引用不会执行任何网络操作。

您还可以创建对集合的引用:

Web version 9

import { collection } from "firebase/firestore";

const usersCollectionRef = collection(db, 'users');

Web version 8

var usersCollectionRef = db.collection('users');
迅速
注意:此产品不适用于 watchOS 和 App Clip 目标。
let usersCollectionRef = db.collection("users")
Objective-C
注意:此产品不适用于 watchOS 和 App Clip 目标。
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

Java

CollectionReference usersCollectionRef = db.collection("users");

Kotlin+KTX

val usersCollectionRef = db.collection("users")

Dart

final usersCollectionRef = db.collection("users");
爪哇
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
Python
users_ref = db.collection(u'users')

Python

users_ref = db.collection("users")
C++
CollectionReference users_collection_reference = db->Collection("users");
节点.js
const usersCollectionRef = db.collection('users');
usersRef := client.Collection("users")
PHP

PHP

有关安装和创建 Cloud Firestore 客户端的更多信息,请参阅Cloud Firestore 客户端库

$collection = $db->collection('samples/php/users');
统一
CollectionReference collectionRef = db.Collection("users");
C#

C#

有关安装和创建 Cloud Firestore 客户端的更多信息,请参阅Cloud Firestore 客户端库

CollectionReference collectionRef = db.Collection("users");
红宝石
collection_ref = firestore.col "users"

为方便起见,您还可以通过将文档或集合的路径指定为字符串来创建引用,路径组件由正斜杠 ( / ) 分隔。例如,要创建对alovelace文档的引用:

Web version 9

import { doc } from "firebase/firestore"; 

const alovelaceDocumentRef = doc(db, 'users/alovelace');

Web version 8

var alovelaceDocumentRef = db.doc('users/alovelace');
迅速
注意:此产品不适用于 watchOS 和 App Clip 目标。
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
注意:此产品不适用于 watchOS 和 App Clip 目标。
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

Java

DocumentReference alovelaceDocumentRef = db.document("users/alovelace");

Kotlin+KTX

val alovelaceDocumentRef = db.document("users/alovelace")

Dart

final aLovelaceDocRef = db.doc("users/alovelace");
爪哇
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
Python
a_lovelace_ref = db.document(u'users/alovelace')

Python

a_lovelace_ref = db.document("users/alovelace")
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
节点.js
const alovelaceDocumentRef = db.doc('users/alovelace');
// Reference to a document with id "alovelace" in the collection "users"
alovelaceRef := client.Doc("users/alovelace")
PHP

PHP

有关安装和创建 Cloud Firestore 客户端的更多信息,请参阅Cloud Firestore 客户端库

$document = $db->document('users/alovelace');
统一
DocumentReference documentRef = db.Document("users/alovelace");
C#

C#

有关安装和创建 Cloud Firestore 客户端的更多信息,请参阅Cloud Firestore 客户端库

DocumentReference documentRef = db.Document("users/alovelace");
红宝石
document_path_ref = firestore.doc "users/alovelace"

分层数据

要了解分层数据结构在 Cloud Firestore 中的工作原理,请考虑一个包含消息和聊天室的示例聊天应用。

您可以创建一个名为 room 的集合来存储不同的聊天rooms

  • 房间

    • A

      name : "my chat room"

    • B

      ...

现在您有了聊天室,决定如何存储您的消息。您可能不想将它们存储在聊天室的文档中。 Cloud Firestore 中的文档应该是轻量级的,聊天室可以包含大量消息。但是,您可以在聊天室文档中创建其他集合,作为子集合。

子集合

在这种情况下存储消息的最佳方式是使用子集合。子集合是与特定文档关联的集合。

您可以为rooms集合中的每个房间文档创建一个名为messages的子集合:

  • 房间

    • A

      name : "my chat room"

      • 消息

        • 消息1

          from : "alex"
          msg : "Hello World!"

        • 消息2

          ...

    • B

      ...

在此示例中,您将使用以下代码在子集合中创建对消息的引用:

Web version 9

import { doc } from "firebase/firestore"; 

const messageRef = doc(db, "rooms", "roomA", "messages", "message1");

Web version 8

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
迅速
注意:此产品不适用于 watchOS 和 App Clip 目标。
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
Objective-C
注意:此产品不适用于 watchOS 和 App Clip 目标。
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];

Java

DocumentReference messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1");

Kotlin+KTX

val messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1")

Dart

final messageRef = db
    .collection("rooms")
    .doc("roomA")
    .collection("messages")
    .doc("message1");
爪哇
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
Python
room_a_ref = db.collection(u'rooms').document(u'roomA')
message_ref = room_a_ref.collection(u'messages').document(u'message1')

Python

room_a_ref = db.collection("rooms").document("roomA")
message_ref = room_a_ref.collection("messages").document("message1")
C++
DocumentReference message_reference = db->Collection("rooms")
    .Document("roomA")
    .Collection("messages")
    .Document("message1");
节点.js
const messageRef = db.collection('rooms').doc('roomA')
  .collection('messages').doc('message1');
messageRef := client.Collection("rooms").Doc("roomA").
	Collection("messages").Doc("message1")
PHP

PHP

有关安装和创建 Cloud Firestore 客户端的更多信息,请参阅Cloud Firestore 客户端库

$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
统一
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
C#

C#

有关安装和创建 Cloud Firestore 客户端的更多信息,请参阅Cloud Firestore 客户端库

DocumentReference documentRef = db
    .Collection("Rooms").Document("RoomA")
    .Collection("Messages").Document("Message1");
红宝石
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

注意集合和文档的交替模式。您的收藏和文档必须始终遵循此模式。您不能引用集合中的集合或文档中的文档。

子集合允许您分层构建数据,使数据更易于访问。要获取roomA中的所有消息,您可以创建对子集合messages的集合引用,并像与任何其他集合引用一样与它进行交互。

子集合中的文档也可以包含子集合,允许您进一步嵌套数据。您可以嵌套最多 100 层的数据。