Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

Cloud Firestore數據模型

Cloud Firestore是一個NoSQL,面向文檔的數據庫。與SQL數據庫不同,沒有表或行。相反,您將數據存儲在文檔中 ,這些文檔被組織成collections

每個文檔包含一組鍵值對。 Cloud Firestore經過優化,可存儲大量小文件。

所有文檔必須存儲在集合中。文檔可以包含子集合和嵌套對象,這兩個子集合都可以包含諸如字符串之類的原始字段或諸如列表之類的複雜對象。

集合和文檔在Cloud Firestore中隱式創建。只需將數據分配給集合中的文檔即可。如果集合或文檔不存在,則Cloud Firestore會創建它。

文件資料

在Cloud Firestore中,存儲單位是文檔。文檔是包含字段的輕量級記錄,這些字段映射到值。每個文檔都有一個名稱標識。

代表用戶alovelace文檔可能如下所示:

  • Alovelace

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

文檔中復雜的嵌套對象稱為地圖。例如,您可以使用地圖來構造上例中的用戶名,如下所示:

  • Alovelace

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

您可能會注意到文檔看起來很像JSON。實際上,它們基本上是。存在一些差異(例如,文檔支持額外的數據類型,並且大小限制為1 MB),但是通常,您可以將文檔視為輕量級JSON記錄。

館藏

文件存放在集合中,集合只是文件的容器。例如,您可能有一個users集合來包含您的各種用戶,每個用戶都由一個文檔表示:

  • 用戶

    • Alovelace

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

    • 旅行

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

Cloud Firestore是無模式的,因此您對在每個文檔中放置哪些字段以及在這些字段中存儲哪些數據類型具有完全的自由。同一集合中的文檔都可以包含不同的字段,或在這些字段中存儲不同類型的數據。但是,最好在多個文檔中使用相同的字段和數據類型,以便您可以更輕鬆地查詢文檔。

集合包含文檔,僅此而已。它不能直接包含帶有值的原始字段,也不能包含其他集合。 (有關如何在Cloud Firestore中構建更複雜的數據的說明,請參閱“ 分層數據 ”。)

集合中文檔的名稱是唯一的。您可以提供自己的密鑰,例如用戶ID,也可以讓Cloud Firestore自動為您創建隨機ID。

您不需要“創建”或“刪除”集合。在集合中創建第一個文檔之後,該集合存在。如果刪除集合中的所有文檔,則它不再存在。

參考文獻

Cloud Firestore中的每個文檔均通過其在數據庫中的位置進行唯一標識。前面的示例在集合users顯示了文檔alovelace 。要在代碼中引用此位置,可以創建對此的引用

網頁
var alovelaceDocumentRef = db.collection('users').doc('alovelace');
迅速
let alovelaceDocumentRef = db.collection("users").document("alovelace")
物鏡
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];

爪哇

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

Kotlin + KTX

val alovelaceDocumentRef = db.collection("users").document("alovelace")
爪哇
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
蟒蛇
a_lovelace_ref = db.collection(u'users').document(u'alovelace')
C ++
DocumentReference alovelace_document_reference =
    db->Collection("users").Document("alovelace");
Node.js
const alovelaceDocumentRef = db.collection('users').doc('alovelace');
alovelaceRef := client.Collection("users").Doc("alovelace")
的PHP
$document = $db->collection('users')->document('lovelace');
統一
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
DocumentReference documentRef = db.Collection("users").Document("alovelace");
紅寶石
document_ref = firestore.col("users").doc("alovelace")

引用是一個輕量級對象,僅指向數據庫中的某個位置。您可以創建參考,無論那裡是否存在數據,並且創建參考不會執行任何網絡操作。

您還可以創建對集合的引用:

網頁
var usersCollectionRef = db.collection('users');
迅速
let usersCollectionRef = db.collection("users")
目標C
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

爪哇

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

Kotlin + KTX

val usersCollectionRef = db.collection("users")
爪哇
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
蟒蛇
users_ref = db.collection(u'users')
C ++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
usersRef := client.Collection("users")
的PHP
$collection = $db->collection('users');
統一
CollectionReference collectionRef = db.Collection("users");
C#
CollectionReference collectionRef = db.Collection("users");
紅寶石
collection_ref = firestore.col "users"

為了方便起見,您還可以通過將文檔或集合的路徑指定為字符串來創建引用,其中路徑部分之間用正斜杠( / )分隔。例如,創建對alovelace文檔的引用:

網頁
var alovelaceDocumentRef = db.doc('users/alovelace');
迅速
let aLovelaceDocumentReference = db.document("users/alovelace")
物鏡
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

爪哇

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

Kotlin + KTX

val alovelaceDocumentRef = db.document("users/alovelace")
爪哇
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
蟒蛇
a_lovelace_ref = db.document(u'users/alovelace')
C ++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
const alovelaceDocumentRef = db.doc('users/alovelace');
alovelaceRef := client.Doc("users/alovelace")
的PHP
$document = $db->document('users/lovelace');
統一
DocumentReference documentRef = db.Document("users/alovelace");
C#
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"

      • 消息

        • message1

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

        • message2

          ...

    • B

      ...

在此示例中,您將使用以下代碼在子集合中創建對消息的引用:

網頁
var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
迅速
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
物鏡
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];

爪哇

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

Kotlin + KTX

val messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1")
爪哇
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
蟒蛇
room_a_ref = db.collection(u'rooms').document(u'roomA')
message_ref = room_a_ref.collection(u'messages').document(u'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');
messageRef := client.Collection("rooms").Doc("roomA").
	Collection("messages").Doc("message1")
的PHP
$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
統一
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
C#
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個深度的數據。