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 modular API

import { doc } from "firebase/firestore";

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

Web namespaced API

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"];

Kotlin+KTX

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

Java

DocumentReference 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("users").document("alovelace")

Python

a_lovelace_ref = db.collection("users").document("alovelace")
C++
DocumentReference alovelace_document_reference =
    db->Collection("users").Document("alovelace");
Node.js
const alovelaceDocumentRef = db.collection('users').doc('alovelace');

import (
	"cloud.google.com/go/firestore"
)

func createDocReference(client *firestore.Client) {

	alovelaceRef := client.Collection("users").Doc("alovelace")

	_ = alovelaceRef
}
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 modular API

import { collection } from "firebase/firestore";

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

Web namespaced API

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

Kotlin+KTX

val usersCollectionRef = db.collection("users")

Java

CollectionReference 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("users")

Python

users_ref = db.collection("users")
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');

import (
	"cloud.google.com/go/firestore"
)

func createCollectionReference(client *firestore.Client) {
	usersRef := client.Collection("users")

	_ = usersRef
}
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 modular API

import { doc } from "firebase/firestore"; 

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

Web namespaced API

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"];

Kotlin+KTX

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

Java

DocumentReference 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("users/alovelace")

Python

a_lovelace_ref = db.document("users/alovelace")
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
const alovelaceDocumentRef = db.doc('users/alovelace');

import (
	"cloud.google.com/go/firestore"
)

func createDocReferenceFromString(client *firestore.Client) {
	// Reference to a document with id "alovelace" in the collection "users"
	alovelaceRef := client.Doc("users/alovelace")

	_ = alovelaceRef
}
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 中的工作原理,請考慮一個包含訊息和聊天室的範例聊天應用程式。

您可以建立一個名為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 modular API

import { doc } from "firebase/firestore"; 

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

Web namespaced API

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"];

Kotlin+KTX

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

Java

DocumentReference 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("rooms").document("roomA")
message_ref = room_a_ref.collection("messages").document("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");
Node.js
const messageRef = db.collection('rooms').doc('roomA')
  .collection('messages').doc('message1');

import (
	"cloud.google.com/go/firestore"
)

func createSubcollectionReference(client *firestore.Client) {
	messageRef := client.Collection("rooms").Doc("roomA").
		Collection("messages").Doc("message1")

	_ = messageRef
}
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 層資料。