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),但一般來說, 這類模型

集合

文件保存在集合中,而文件容器只是文件的容器。適用對象 比方說,您可以建立一個 users 集合,其中包含不同的使用者 以文件表示

  • 位使用者

    • 座情人節

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

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

Cloud Firestore 是無結構定義的資料庫,因此您可以自由選擇 欄位,以及儲存在這些欄位中的資料類型。 同一集合中的文件可以包含不同欄位或儲存庫 不同類型的資料不過,建議您使用 相同欄位和資料類型來查詢。 文件。

集合中含有文件,但沒有內容。無法直接包含原始 欄位,而且不能包含其他集合。(請參閱階層式 資料,說明如何建構較為複雜的架構 讀取及寫入資料)

集合中的文件名稱不得重複。您可以提供自己的 或 Cloud Firestore 建立隨機 ID 不必手動調整設定

不需要「建立」或「刪除」集合。建立第一個 集合中已有文件。如果您將 文件集合中的文件,就會不存在。

參考資料

Cloud Firestore 中的每份文件都會依其位置識別 資料庫內的資源上一個範例在alovelace 集合 users。如要在程式碼中參照這個位置,可以建立 參照

Web

import { doc } from "firebase/firestore";

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

Web

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Swift
注意:這項產品不適用於 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");
Java
// 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');
Go

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');
Unity
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#

C#

如要進一步瞭解如何安裝及建立 Cloud Firestore 用戶端,請參閱 Cloud Firestore 用戶端程式庫

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

參照是一種輕量級物件,只會指向您 資料庫無論是否有資料,您都可以建立參照 建立參照不會執行任何網路作業。

您也可以建立集合的參照:

Web

import { collection } from "firebase/firestore";

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

Web

var usersCollectionRef = db.collection('users');
Swift
注意:這項產品不適用於 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");
Java
// 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');
Go

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');
Unity
CollectionReference collectionRef = db.Collection("users");
C#

C#

如要進一步瞭解如何安裝及建立 Cloud Firestore 用戶端,請參閱 Cloud Firestore 用戶端程式庫

CollectionReference collectionRef = db.Collection("users");
Ruby
collection_ref = firestore.col "users"

為方便起見,您也可以透過指定路徑, 視為字串的文件或集合,並具有以向前分隔的路徑元件 斜線 (/),舉例來說,如要建立 alovelace 文件的參照:

Web

import { doc } from "firebase/firestore"; 

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

Web

var alovelaceDocumentRef = db.doc('users/alovelace');
Swift
注意:這項產品不適用於 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");
Java
// 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');
Go

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');
Unity
DocumentReference documentRef = db.Document("users/alovelace");
C#

C#

如要進一步瞭解如何安裝及建立 Cloud Firestore 用戶端,請參閱 Cloud Firestore 用戶端程式庫

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

階層式資料

如要瞭解階層式資料結構在 Cloud Firestore 中的運作方式, 請考慮使用包含訊息和聊天室的即時通訊應用程式範例。

你可以建立名為 rooms 的珍藏內容來儲存不同的聊天室:

  • 個房間

    • 間客房 A

      name : "my chat room"

    • 間房間 B

      ...

建立聊天室後,接著請決定訊息的儲存方式。您可能不會 想將這些內容儲存在聊天室的文件中Cloud Firestore 中的文件 聊天室中可以包含大量訊息。 不過,您可以在聊天室的文件中建立其他珍藏內容, 做為子集合

子集合

在這種情況下,儲存訊息的最佳方式就是使用子集合。A 罩杯 子集合是與特定文件相關的集合。

你可以為以下位置的所有會議室文件建立名為 messages 的子集合 您的 rooms 最愛:

  • 個房間

    • 間客房 A

      name : "my chat room"

      • 訊息

        • 訊息 1

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

        • 訊息 2

          ...

    • 間房間 B

      ...

在這個範例中,您要為子集合中的訊息建立參照。 替換為下列程式碼:

Web

import { doc } from "firebase/firestore"; 

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

Web

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
Swift
注意:這項產品不適用於 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");
Java
// 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');
Go

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');
Unity
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");
Ruby
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

請注意集合和文件的交替模式。你的珍藏內容 文件一律須依循這個模式無法參照集合 嵌入到文件集或文件中

子集合可讓您按階層整理資料,以便簡化資料 資源存取權如要接收「roomA」中的所有訊息,你可以建立珍藏內容參照 傳送至子集合 messages,並像平常一樣與其互動 集合參照。

子集合中的文件也能包含子集合,方便你: 進一步保護資料您可以為資料建立巢狀結構,最深可達 100 層。