Catch up on highlights from Firebase at Google I/O 2023. Learn more

โมเดลข้อมูล 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 ได้รับการระบุโดยไม่ซ้ำกันโดยตำแหน่งภายในฐานข้อมูล ตัวอย่างก่อนหน้านี้แสดงเอกสาร alovelace ภายในคอลเล็กชัน users หากต้องการอ้างอิงถึงตำแหน่งนี้ในโค้ดของคุณ คุณสามารถสร้าง การอ้างอิง ถึงตำแหน่งนั้นได้

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")
วัตถุประสงค์-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");
หลาม
a_lovelace_ref = db.collection('users').document('alovelace')

Python

a_lovelace_ref = db.collection("users").document("alovelace")
ภาษาซี++
DocumentReference alovelace_document_reference =
    db->Collection("users").Document("alovelace");
โหนด 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
}
พี.เอช.พี

พี.เอช.พี

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและการสร้างไคลเอ็นต์ Cloud Firestore โปรดดูที่ Cloud Firestore Client Libraries

$document = $db->collection('samples/php/users')->document('alovelace');
ความสามัคคี
DocumentReference documentRef = db.Collection("users").Document("alovelace");
ค#

ค#

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและการสร้างไคลเอ็นต์ Cloud Firestore โปรดดูที่ Cloud Firestore Client Libraries

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")
วัตถุประสงค์-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");
หลาม
users_ref = db.collection('users')

Python

users_ref = db.collection("users")
ภาษาซี++
CollectionReference users_collection_reference = db->Collection("users");
โหนด js
const usersCollectionRef = db.collection('users');
ไป

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

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

	_ = usersRef
}
พี.เอช.พี

พี.เอช.พี

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและการสร้างไคลเอ็นต์ Cloud Firestore โปรดดูที่ Cloud Firestore Client Libraries

$collection = $db->collection('samples/php/users');
ความสามัคคี
CollectionReference collectionRef = db.Collection("users");
ค#

ค#

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและการสร้างไคลเอ็นต์ Cloud Firestore โปรดดูที่ Cloud Firestore Client Libraries

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")
วัตถุประสงค์-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");
หลาม
a_lovelace_ref = db.document('users/alovelace')

Python

a_lovelace_ref = db.document("users/alovelace")
ภาษาซี++
DocumentReference alovelace_document = db->Document("users/alovelace");
โหนด 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
}
พี.เอช.พี

พี.เอช.พี

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและการสร้างไคลเอ็นต์ Cloud Firestore โปรดดูที่ Cloud Firestore Client Libraries

$document = $db->document('users/alovelace');
ความสามัคคี
DocumentReference documentRef = db.Document("users/alovelace");
ค#

ค#

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและการสร้างไคลเอ็นต์ Cloud Firestore โปรดดูที่ Cloud Firestore Client Libraries

DocumentReference documentRef = db.Document("users/alovelace");
ทับทิม
document_path_ref = firestore.doc "users/alovelace"

ข้อมูลลำดับชั้น

หากต้องการทำความเข้าใจว่าโครงสร้างข้อมูลแบบลำดับชั้นทำงานอย่างไรใน Cloud Firestore ให้พิจารณาตัวอย่างแอปแชทที่มีข้อความและห้องสนทนา

คุณสามารถสร้างคอลเลกชันที่เรียกว่า rooms เพื่อจัดเก็บห้องสนทนาต่างๆ:

  • ห้อง

    • name : "my chat room"

    • ...

เมื่อคุณมีห้องสนทนาแล้ว ให้ตัดสินใจว่าจะจัดเก็บข้อความของคุณอย่างไร คุณอาจไม่ต้องการเก็บไว้ในเอกสารของห้องสนทนา เอกสารใน Cloud Firestore ควรมีขนาดเล็ก และห้องสนทนาอาจมีข้อความจำนวนมาก อย่างไรก็ตาม คุณสามารถสร้างคอลเลกชันเพิ่มเติมภายในเอกสารของห้องสนทนาของคุณ เป็นคอลเลกชันย่อย

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

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

คุณสามารถสร้างคอลเลกชันย่อยที่เรียกว่า messages สำหรับเอกสารห้องทุกห้องในคอลเลกชัน rooms ของคุณ:

  • ห้อง

    • name : "my chat room"

      • ข้อความ

        • ข้อความ 1

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

        • ข้อความ 2

          ...

    • ...

ในตัวอย่างนี้ คุณจะสร้างการอ้างอิงถึงข้อความในคอลเลกชันย่อยด้วยรหัสต่อไปนี้:

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")
วัตถุประสงค์-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");
หลาม
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")
ภาษาซี++
DocumentReference message_reference = db->Collection("rooms")
    .Document("roomA")
    .Collection("messages")
    .Document("message1");
โหนด 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
}
พี.เอช.พี

พี.เอช.พี

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและการสร้างไคลเอ็นต์ Cloud Firestore โปรดดูที่ Cloud Firestore Client Libraries

$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
ความสามัคคี
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
ค#

ค#

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและการสร้างไคลเอ็นต์ Cloud Firestore โปรดดูที่ Cloud Firestore Client Libraries

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 ระดับ