Cloud Firestore là một cơ sở dữ liệu NoSQL, hướng tài liệu. Không giống như cơ sở dữ liệu SQL, không có bảng hoặc hàng. Thay vào đó, bạn lưu trữ dữ liệu trong tài liệu, được sắp xếp thành bộ sưu tập.
Mỗi tài liệu chứa một tập hợp các cặp khoá-giá trị. Cloud Firestore được tối ưu hoá để lưu trữ những bộ sưu tập lớn gồm các tài liệu nhỏ.
Mọi tài liệu phải được lưu trữ trong bộ sưu tập. Tài liệu có thể chứa tập hợp con và đối tượng lồng nhau, cả hai đều có thể chứa các trường gốc như chuỗi hoặc đối tượng phức tạp như danh sách.
Các bộ sưu tập và tài liệu được tạo ngầm trong Cloud Firestore. Chỉ cần gán dữ liệu cho tài liệu trong một bộ sưu tập. Nếu bộ sưu tập hoặc tài liệu không tồn tại, Cloud Firestore sẽ tạo bộ sưu tập hoặc tài liệu đó.
Tài liệu
Trong Cloud Firestore, đơn vị lưu trữ chính là tài liệu. Tài liệu là một bản ghi gọn nhẹ chứa các trường, liên kết với các giá trị. Mỗi tài liệu được xác định theo tên.
Tài liệu đại diện cho người dùng alovelace
có thể có dạng như sau:
Vòng yêu
first : "Ada"
last : "Lovelace"
born : 1815
Các đối tượng phức tạp, được lồng trong một tài liệu được gọi là bản đồ. Ví dụ: bạn có thể sắp xếp cấu trúc tên người dùng trong ví dụ ở trên bằng một bản đồ như sau:
Vòng yêu
name :
first : "Ada"
last : "Lovelace"
born : 1815
Bạn có thể thấy rằng tài liệu trông rất giống JSON. Trên thực tế, về cơ bản là chúng. Có một số điểm khác biệt (ví dụ: tài liệu hỗ trợ các loại dữ liệu bổ sung và bị giới hạn về kích thước ở mức 1 MB). Tuy nhiên, nhìn chung, bạn có thể coi tài liệu là bản ghi JSON nhẹ.
Bộ sưu tập
Tài liệu nằm trong bộ sưu tập, đơn giản là vùng chứa tài liệu. Ví dụ: bạn có thể có một bộ sưu tập users
để chứa nhiều người dùng, mỗi người dùng được biểu thị bằng một tài liệu:
người dùng
Vòng yêu
first : "Ada"
last : "Lovelace"
born : 1815
Đang tham gia
first : "Alan"
last : "Turing"
born : 1912
Cloud Firestore không có giản đồ, vì vậy, bạn có thể hoàn toàn tự do chọn những trường bạn đưa vào mỗi tài liệu cũng như những loại dữ liệu bạn lưu trữ trong những trường đó. Tất cả các tài liệu trong cùng một tập hợp có thể chứa các trường khác nhau hoặc lưu trữ nhiều loại dữ liệu trong những trường đó. Tuy nhiên, bạn nên sử dụng cùng các trường và kiểu dữ liệu trên nhiều tài liệu để có thể truy vấn tài liệu dễ dàng hơn.
Bộ sưu tập chứa các tài liệu và không có nội dung nào khác. Tệp này không trực tiếp chứa các trường thô chứa giá trị và không thể chứa các bộ sưu tập khác. (Vui lòng xem phần Dữ liệu phân cấp để biết nội dung giải thích về cách định cấu trúc dữ liệu phức tạp hơn trong Cloud Firestore.)
Tên của các tài liệu trong một bộ sưu tập là không trùng lặp. Bạn có thể cung cấp các khoá của riêng mình, chẳng hạn như mã nhận dạng người dùng, hoặc bạn có thể để Cloud Firestore tự động tạo mã nhận dạng ngẫu nhiên cho bạn.
Bạn không cần phải "tạo" hoặc "xoá" bộ sưu tập. Sau khi bạn tạo tài liệu đầu tiên trong bộ sưu tập, bộ sưu tập đó sẽ tồn tại. Nếu bạn xoá tất cả tài liệu trong một bộ sưu tập, bộ sưu tập đó sẽ không còn tồn tại.
Tài liệu tham khảo
Mỗi tài liệu trong Cloud Firestore được xác định riêng biệt theo vị trí của tài liệu đó trong cơ sở dữ liệu. Ví dụ trước cho thấy một tài liệu alovelace
trong
bộ sưu tập users
. Để tham chiếu đến vị trí này trong mã, bạn có thể tạo tham chiếu đến vị trí đó.
Web
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users', 'alovelace');
Web
var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Swift
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective-C
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
Python
Python
C++
DocumentReference alovelace_document_reference = db->Collection("users").Document("alovelace");
Node.js
Tiến hành
PHP
PHP
Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo bài viết Thư viện ứng dụng Cloud Firestore.
Unity
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
C#
Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo bài viết Thư viện ứng dụng Cloud Firestore.
Ruby
Tệp đối chiếu là một đối tượng nhẹ chỉ trỏ đến một vị trí trong cơ sở dữ liệu của bạn. Bạn có thể tạo tham chiếu cho dù dữ liệu có tồn tại hay không và việc tạo tham chiếu không thực hiện bất kỳ hoạt động mạng nào.
Bạn cũng có thể tạo tệp tham chiếu cho bộ sưu tập:
Web
import { collection } from "firebase/firestore"; const usersCollectionRef = collection(db, 'users');
Web
var usersCollectionRef = db.collection('users');
Swift
let usersCollectionRef = db.collection("users")
Objective-C
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
Python
Python
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
Tiến hành
PHP
PHP
Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo bài viết Thư viện ứng dụng Cloud Firestore.
Unity
CollectionReference collectionRef = db.Collection("users");
C#
C#
Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo bài viết Thư viện ứng dụng Cloud Firestore.
Ruby
Để thuận tiện, bạn cũng có thể tạo tệp đối chiếu bằng cách chỉ định đường dẫn đến tài liệu hoặc tập hợp dưới dạng chuỗi, với các thành phần đường dẫn được phân tách bằng dấu gạch chéo lên (/
). Ví dụ: để tạo tham chiếu đến tài liệu alovelace
:
Web
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users/alovelace');
Web
var alovelaceDocumentRef = db.doc('users/alovelace');
Swift
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
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
Python
Python
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
Tiến hành
PHP
PHP
Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo bài viết Thư viện ứng dụng Cloud Firestore.
Unity
DocumentReference documentRef = db.Document("users/alovelace");
C#
C#
Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo bài viết Thư viện ứng dụng Cloud Firestore.
Ruby
Dữ liệu phân cấp
Để hiểu cách hoạt động của cấu trúc dữ liệu phân cấp trong Cloud Firestore, hãy xem xét một ứng dụng trò chuyện mẫu có tin nhắn và phòng trò chuyện.
Bạn có thể tạo một bộ sưu tập có tên là rooms
để lưu trữ nhiều phòng trò chuyện:
phòng
phòngA
name : "my chat room"
phòngB
...
Vì bạn đã có phòng trò chuyện, hãy quyết định cách lưu trữ tin nhắn. Bạn có thể không muốn lưu trữ chúng trong tài liệu của phòng trò chuyện. Tài liệu trong Cloud Firestore cần có dung lượng nhẹ và một phòng trò chuyện có thể chứa số lượng lớn tin nhắn. Tuy nhiên, bạn có thể tạo thêm các bộ sưu tập khác trong tài liệu của phòng trò chuyện, dưới dạng các bộ sưu tập con.
Bộ sưu tập phụ
Cách tốt nhất để lưu trữ thông báo trong trường hợp này là sử dụng bộ sưu tập con. Bộ sưu tập con là một tập hợp được liên kết với một tài liệu cụ thể.
Bạn có thể tạo một bộ sưu tập con có tên là messages
cho mọi tài liệu trong phòng trong bộ sưu tập rooms
của mình:
phòng
phòngA
name : "my chat room"
tin nhắn
thông báo 1
from : "alex"
msg : "Hello World!"
thông báo 2
...
phòngB
...
Trong ví dụ này, bạn sẽ tạo tham chiếu đến thông báo trong bộ sưu tập con bằng mã sau:
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
let messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1")
Objective-C
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
Python
Python
C++
DocumentReference message_reference = db->Collection("rooms") .Document("roomA") .Collection("messages") .Document("message1");
Node.js
Tiến hành
PHP
PHP
Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo bài viết Thư viện ứng dụng Cloud Firestore.
Unity
DocumentReference documentRef = db .Collection("Rooms").Document("RoomA") .Collection("Messages").Document("Message1");
C#
C#
Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo bài viết Thư viện ứng dụng Cloud Firestore.
Ruby
Hãy lưu ý mẫu xen kẽ của tập hợp và tài liệu. Bộ sưu tập và tài liệu của bạn phải luôn tuân theo mẫu này. Bạn không thể tham chiếu đến một tập hợp trong một tập hợp hoặc một tài liệu trong một tài liệu.
Tập hợp con cho phép bạn định cấu trúc dữ liệu theo hệ phân cấp, giúp truy cập dữ liệu dễ dàng hơn. Để nhận tất cả thông báo trong roomA
, bạn có thể tạo một tham chiếu đến bộ sưu tập con messages
và tương tác với bộ sưu tập đó như cách bạn thực hiện với bất kỳ tham chiếu bộ sưu tập nào khác.
Tài liệu trong các tập hợp con cũng có thể chứa các tập hợp con, cho phép bạn lồng thêm dữ liệu. Bạn có thể lồng dữ liệu với tối đa 100 cấp độ.