Model data Cloud Firestore

Cloud Firestore adalah database NoSQL berorientasi dokumen. Tidak seperti database SQL, Cloud Firestore tidak memiliki tabel atau baris. Sebagai gantinya, data disimpan dalam berbagai dokumen, yang disusun menjadi koleksi.

Setiap dokumen berisi kumpulan key-value pair. Cloud Firestore dioptimalkan untuk menyimpan koleksi besar berbagai dokumen kecil.

Semua dokumen harus disimpan dalam koleksi. Dokumen dapat berisi subkoleksi dan objek bertingkat. Sementara itu, subkoleksi dan objek bertingkat dapat mencakup kolom standar (misalnya, string) atau objek kompleks (misalnya, daftar).

Koleksi dan dokumen dibuat secara implisit di Cloud Firestore. Cukup tetapkan data ke dokumen dalam koleksi. Jika koleksi atau dokumen tidak ada, Cloud Firestore akan membuatnya.

Dokumen

Unit penyimpanan di Cloud Firestore adalah dokumen. Dokumen adalah data ringan yang berisi kolom, yang dipetakan ke nilai. Setiap dokumen diidentifikasi dengan nama.

Dokumen yang mewakili pengguna alovelace mungkin terlihat seperti ini:

  • alovelace

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

Objek kompleks dan bertingkat dalam dokumen disebut peta. Misalnya, Anda dapat membuat struktur nama pengguna dari contoh di atas dengan peta, seperti ini:

  • alovelace

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

Seperti dapat dilihat, dokumen sangat mirip dengan JSON. Faktanya, keduanya memang sangat mirip. Ada beberapa perbedaan (misalnya, dokumen mendukung jenis data tambahan dan ukurannya terbatas hingga 1 MB). Namun secara umum, Anda dapat memperlakukan dokumen sebagai data JSON ringan.

Koleksi

Dokumen berada dalam koleksi, yang merupakan container-nya. Misalnya, Anda dapat memiliki koleksi users untuk menampung berbagai pengguna, yang masing-masing diwakili oleh dokumen:

  • users

    • alovelace

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

    • aturing

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

Cloud Firestore tidak berskema, sehingga Anda bebas memilih kolom yang ingin dimasukkan ke dalam setiap dokumen dan jenis data yang ingin disimpan di kolom tersebut. Dokumen dalam koleksi yang sama dapat berisi kolom yang berbeda, atau menyimpan jenis data yang berbeda di kolom tersebut. Namun, sebaiknya gunakan kolom dan jenis data yang sama untuk beberapa dokumen, sehingga Anda dapat membuat kueri dokumen dengan lebih mudah.

Koleksi hanya berisi dokumen. Koleksi tidak dapat langsung berisi kolom mentah dengan nilai, dan tidak dapat berisi koleksi lainnya. (Baca bagian Data Hierarkis untuk mengetahui penjelasan mengenai cara membuat struktur data yang lebih kompleks di Cloud Firestore.)

Nama dokumen dalam koleksi bersifat unik. Anda dapat memasukkan kunci Anda sendiri, seperti ID pengguna, atau Anda dapat membiarkan Cloud Firestore membuatkan ID acak secara otomatis.

Anda tidak perlu "membuat" atau "menghapus" koleksi. Setelah dokumen pertama dalam koleksi dibuat, koleksi tersebut akan otomatis ada. Jika semua dokumen dalam koleksi dihapus, koleksi tersebut akan otomatis terhapus.

Referensi

Setiap dokumen di Cloud Firestore dikenali secara unik berdasarkan lokasinya di dalam database. Contoh sebelumnya menunjukkan dokumen alovelace dalam koleksi users. Untuk merujuk ke lokasi ini dalam kode Anda, buat referensi yang menunjuk padanya.

API modular web

import { doc } from "firebase/firestore";

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

API dengan namespace web

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Swift
Catatan: Produk ini tidak tersedia di target watchOS dan App Clip.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective-C
Catatan: Produk ini tidak tersedia di target watchOS dan 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

Untuk mengetahui informasi lebih lanjut tentang cara menginstal dan membuat klien Cloud Firestore, lihat Library Klien Cloud Firestore.

$document = $db->collection('samples/php/users')->document('alovelace');
Unity
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#

C#

Untuk mengetahui informasi lebih lanjut tentang cara menginstal dan membuat klien Cloud Firestore, lihat Library Klien Cloud Firestore.

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

Referensi adalah objek ringan yang hanya menunjuk ke lokasi di database Anda. Anda dapat membuat referensi, terlepas dari ada atau tidaknya data di lokasi tersebut. Pembuatan referensi tidak akan memicu operasi jaringan.

Anda juga dapat membuat referensi ke koleksi:

API modular web

import { collection } from "firebase/firestore";

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

API dengan namespace web

var usersCollectionRef = db.collection('users');
Swift
Catatan: Produk ini tidak tersedia di target watchOS dan App Clip.
let usersCollectionRef = db.collection("users")
Objective-C
Catatan: Produk ini tidak tersedia di target watchOS dan 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

Untuk mengetahui informasi lebih lanjut tentang cara menginstal dan membuat klien Cloud Firestore, lihat Library Klien Cloud Firestore.

$collection = $db->collection('samples/php/users');
Unity
CollectionReference collectionRef = db.Collection("users");
C#

C#

Untuk mengetahui informasi lebih lanjut tentang cara menginstal dan membuat klien Cloud Firestore, lihat Library Klien Cloud Firestore.

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

Untuk memudahkan, Anda juga dapat membuat referensi dengan menentukan jalur ke dokumen atau koleksi sebagai string, dengan komponen jalur yang dipisahkan oleh garis miring (/). Misalnya, untuk membuat referensi ke dokumen alovelace:

API modular web

import { doc } from "firebase/firestore"; 

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

API dengan namespace web

var alovelaceDocumentRef = db.doc('users/alovelace');
Swift
Catatan: Produk ini tidak tersedia di target watchOS dan App Clip.
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
Catatan: Produk ini tidak tersedia di target watchOS dan 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

Untuk mengetahui informasi lebih lanjut tentang cara menginstal dan membuat klien Cloud Firestore, lihat Library Klien Cloud Firestore.

$document = $db->document('users/alovelace');
Unity
DocumentReference documentRef = db.Document("users/alovelace");
C#

C#

Untuk mengetahui informasi lebih lanjut tentang cara menginstal dan membuat klien Cloud Firestore, lihat Library Klien Cloud Firestore.

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

Data Hierarkis

Untuk memahami cara kerja struktur data hierarkis di Cloud Firestore, bayangkan contoh suatu aplikasi chat yang memiliki pesan dan ruang chat.

Anda dapat membuat koleksi yang disebut rooms untuk menyimpan berbagai ruang chat:

  • rooms

    • roomA

      name : "my chat room"

    • roomB

      ...

Setelah menambahkan ruang chat, tentukan cara menyimpan pesan. Sebaiknya jangan simpan pesan di dokumen ruang chat. Dokumen di Cloud Firestore harus ringan, padahal suatu ruang chat bisa berisi pesan dalam jumlah besar. Namun, Anda dapat membuat koleksi tambahan di dalam dokumen ruang chat sebagai subkoleksi.

Subkoleksi

Cara terbaik untuk menyimpan pesan dalam skenario ini adalah dengan menggunakan subkoleksi. Subkoleksi adalah koleksi yang terkait dengan dokumen tertentu.

Anda dapat membuat subkoleksi yang disebut messages untuk setiap dokumen ruang di koleksi rooms:

  • rooms

    • roomA

      name : "my chat room"

      • messages

        • message1

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

        • message2

          ...

    • roomB

      ...

Dalam contoh ini, Anda akan membuat referensi ke pesan di subkoleksi dengan kode berikut:

API modular web

import { doc } from "firebase/firestore"; 

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

API dengan namespace web

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
Swift
Catatan: Produk ini tidak tersedia di target watchOS dan App Clip.
let messageRef = db
  .collection("rooms").document("roomA")
  .collection("messages").document("message1")
Objective-C
Catatan: Produk ini tidak tersedia di target watchOS dan 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

Untuk mengetahui informasi lebih lanjut tentang cara menginstal dan membuat klien Cloud Firestore, lihat Library Klien 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#

Untuk mengetahui informasi lebih lanjut tentang cara menginstal dan membuat klien Cloud Firestore, lihat Library Klien 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")

Perhatikan pola bergantian antara koleksi dan dokumen. Koleksi dan dokumen Anda harus selalu mengikuti pola ini. Anda tidak dapat merujuk ke suatu koleksi dalam koleksi atau merujuk ke suatu dokumen dalam dokumen.

Dengan subkoleksi, Anda dapat menyusun data secara hierarkis, sehingga membuat data lebih mudah diakses. Untuk mendapatkan semua pesan di roomA, Anda dapat membuat referensi koleksi ke subkoleksi messages dan berinteraksi dengannya sama seperti saat menggunakan referensi koleksi lainnya.

Dokumen dalam subkoleksi dapat berisi subkoleksi juga, sehingga Anda dapat membuat data makin bertingkat. Anda dapat membuat data bertingkat hingga kedalaman 100 tingkat.