โมเดลข้อมูลใน Cloud Firestore

Cloud Firestore เป็นฐานข้อมูล NoSQL ที่เน้นเอกสาร ซึ่งต่างจากฐานข้อมูล SQL ไม่มีตารางหรือแถว แต่คุณจะจัดเก็บข้อมูลไว้ในเอกสาร ซึ่งก็คือ จัดระเบียบเป็นคอลเล็กชัน

document แต่ละรายการจะมีชุดคู่คีย์-ค่า Cloud Firestore คือ เหมาะสำหรับการจัดเก็บคอลเล็กชันขนาดใหญ่ของเอกสารขนาดเล็ก

เอกสารทั้งหมดต้องเก็บไว้ในคอลเล็กชัน เอกสารสามารถประกอบด้วย subcollections และออบเจ็กต์ที่ซ้อนกัน ซึ่งทั้งคู่อาจมีช่องพื้นฐาน เช่น สตริงหรือออบเจ็กต์ที่ซับซ้อนอย่างรายการ

ระบบจะสร้างคอลเล็กชันและเอกสารใน 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 เป็นแบบไร้สคีมา คุณจึงมีอิสระอย่างสมบูรณ์ในการ ช่องที่คุณใส่ไว้ในเอกสารแต่ละฉบับ และประเภทข้อมูลที่จัดเก็บในช่องเหล่านั้น เอกสารภายในคอลเล็กชันเดียวกันอาจมีฟิลด์หรือร้านค้าที่แตกต่างกันได้ ประเภทต่างๆ ในฟิลด์เหล่านั้น อย่างไรก็ตาม ขอแนะนำให้คุณใช้ ฟิลด์และประเภทข้อมูลเดียวกันในเอกสารหลายฉบับ ดังนั้นคุณสามารถค้นหา เอกสารได้ง่ายขึ้น

โดยคอลเล็กชันจะมีเอกสารและไม่มีข้อมูลอื่นใดอีก ต้องไม่มีไฟล์ข้อมูล RAW โดยตรง ด้วยค่า และต้องไม่มีคอลเล็กชันอื่นๆ (ดูลำดับชั้น ข้อมูลสำหรับคำอธิบายวิธีจัดโครงสร้างที่ซับซ้อนยิ่งขึ้น ใน Cloud Firestore)

ชื่อเอกสารภายในคอลเล็กชันจะไม่ซ้ำกัน คุณสามารถระบุ เช่น User-ID หรือให้ Cloud Firestore สร้างรหัสแบบสุ่มก็ได้ ให้คุณโดยอัตโนมัติ

คุณไม่จำเป็นต้อง "สร้าง" หรือ "ลบ" คอลเล็กชัน หลังจากสร้างโฆษณาแรก เอกสารในคอลเล็กชัน มีคอลเล็กชันนั้นอยู่ ถ้าคุณลบรายการทั้งหมด เอกสารในคอลเล็กชัน เอกสารนั้นไม่มีอยู่อีกต่อไป

รายการอ้างอิง

เอกสารทุกรายการใน 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 ควรมีขนาดเล็ก และห้องแชทอาจมีข้อความจำนวนมาก แต่คุณสามารถสร้างคอลเล็กชันเพิ่มเติมภายในเอกสารของห้องแชทได้ เป็นคอลเล็กชันย่อย

คอลเล็กชันย่อย

วิธีที่ดีที่สุดในการจัดเก็บข้อความในสถานการณ์นี้คือการใช้คอลเล็กชันย่อย ต คอลเล็กชันย่อยคือคอลเล็กชันที่เชื่อมโยงกับเอกสารหนึ่งๆ

คุณสามารถสร้างคอลเล็กชันย่อยชื่อ 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 และโต้ตอบกับคอลเล็กชันนั้นในลักษณะเดียวกับที่ทำ และข้อมูลอ้างอิงของคอลเล็กชัน

เอกสารในคอลเล็กชันย่อยก็จะมีคอลเล็กชันย่อยได้เช่นกัน ซึ่งจะช่วยให้คุณดำเนินการต่อไปนี้ได้ ข้อมูล Nest เพิ่มเติม คุณสามารถซ้อนข้อมูลได้สูงสุด 100 ระดับ