โมเดลข้อมูล 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 แบบ Lightweight ได้

คอลเลกชัน

เอกสารอยู่ในคอลเลกชัน ซึ่งเป็นเพียงที่เก็บเอกสาร ตัวอย่างเช่น คุณสามารถมีคอลเลกชัน users เพื่อบรรจุผู้ใช้ต่างๆ ของคุณ โดยแต่ละรายจะแสดงด้วยเอกสาร:

  • ผู้ใช้

    • รัก

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

    • การเรียนใน

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

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

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

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

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

อ้างอิง

เอกสารทุกฉบับใน 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
}
PHP

PHP

หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและการสร้างไคลเอ็นต์ 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
}
PHP

PHP

หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและการสร้างไคลเอ็นต์ 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
}
PHP

PHP

หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและการสร้างไคลเอ็นต์ 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
}
PHP

PHP

หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและการสร้างไคลเอ็นต์ 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 ระดับ