Cloud Firestore הוא מסד נתונים מסוג NoSQL שמתמקד במסמכים. בניגוד למסד נתונים של SQL, אין טבלאות או שורות. במקום זאת, הנתונים מאוחסנים במסמכים, שמאורגנים באוספים.
כל מסמך מכיל קבוצה של צמדי מפתח/ערך. Cloud Firestore מותאם לאחסון אוספים גדולים של מסמכים קטנים.
כל המסמכים חייבים להיות מאוחסנים באוספים. מסמכים יכולים להכיל אוספים משניים ואובייקטים בתצוגת עץ, ושניהם יכולים לכלול שדות פרימיטיביים כמו מחרוזות או אובייקטים מורכבים כמו רשימות.
אוספים ומסמכים נוצרים באופן משתמע ב-Cloud Firestore. פשוט מקצים נתונים למסמך בתוך אוסף. אם האוסף או המסמך לא קיימים, Cloud Firestore יוצר אותם.
מסמכים
ב-Cloud Firestore, יחידת האחסון היא המסמך. מסמך הוא רשומה קטנה מדי שמכילה שדות, שממופים לערכים. לכל מסמך יש שם.
מסמך שמייצג משתמש alovelace
עשוי להיראות כך:
alovelace
first : "Ada"
last : "Lovelace"
born : 1815
אובייקטים מורכבים ומקוננים במסמך נקראים מפות. לדוגמה, אפשר ליצור את המבנה של שם המשתמש מהדוגמה שלמעלה באמצעות מפה, כך:
שרוך זוהר בצבע
name :
first : "Ada"
last : "Lovelace"
born : 1815
יכול להיות שתבחינו שהמסמכים דומים מאוד ל-JSON. למעשה, הם בעצם כאלה. יש כמה הבדלים (למשל, מסמכים תומכים בסוגי נתונים נוספים והגודל שלהם מוגבל ל-1MB), אבל באופן כללי אפשר להתייחס למסמכים כרשומות JSON קלות.
אוספים
המסמכים נמצאים באוספים, שהם פשוט מאגרים של מסמכים. לדוגמה, אפשר ליצור אוסף users
שיכיל את המשתמשים השונים, כאשר כל משתמש מיוצג במסמך:
משתמשים
alovelace
first : "Ada"
last : "Lovelace"
born : 1815
בנסיעה
first : "Alan"
last : "Turing"
born : 1912
Cloud Firestore הוא ללא סכימה, כך שיש לכם חופש מלא לגבי השדות שתוסיפו לכל מסמך וסוג הנתונים שתשמרו בשדות האלה. כל המסמכים באותה אוסף יכולים להכיל שדות שונים או לאחסן סוגים שונים של נתונים בשדות האלה. עם זאת, מומלץ להשתמש באותם שדות ובאותם סוגי נתונים במספר מסמכים, כדי שתוכלו להריץ שאילתות על המסמכים בקלות רבה יותר.
אוסף מכיל מסמכים בלבד. הוא לא יכול להכיל שדות גולמיים עם ערכים באופן ישיר, והוא לא יכול להכיל אוספים אחרים. (במאמר נתונים היררכיים מוסבר איך ליצור מבנה לנתונים מורכבים יותר ב-Cloud Firestore).
שמות המסמכים בתוך אוסף הם ייחודיים. אתם יכולים לספק מפתחות משלכם, כמו מזהי משתמשים, או לאפשר ל-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
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
Go
PHP
PHP
מידע נוסף על התקנה ויצירה של לקוח Cloud Firestore זמין במאמר ספריות לקוח של Cloud Firestore.
Unity
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
C#
מידע נוסף על התקנה ויצירה של לקוח Cloud Firestore זמין במאמר ספריות לקוח של Cloud Firestore.
Ruby
קובץ עזר הוא אובייקט קל שמצביע למיקום במסד הנתונים שלכם. אפשר ליצור הפניה גם אם אין בה נתונים, ויצירת הפניה לא מבצעת פעולות רשת.
אפשר גם ליצור הפניות לאוספים:
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
Go
PHP
PHP
מידע נוסף על התקנה ויצירה של לקוח Cloud Firestore זמין במאמר ספריות לקוח של Cloud Firestore.
Unity
CollectionReference collectionRef = db.Collection("users");
C#
C#
מידע נוסף על התקנה ויצירה של לקוח Cloud Firestore זמין במאמר ספריות לקוח של Cloud Firestore.
Ruby
מטעמי נוחות, אפשר גם ליצור הפניות על ידי ציון הנתיב למסמך או לאוסף כמחרוזת, כאשר רכיבי הנתיב מופרדים באמצעות קו נטוי (/
). לדוגמה, כדי ליצור הפניה למסמך 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
Go
PHP
PHP
מידע נוסף על התקנה ויצירה של לקוח Cloud Firestore זמין במאמר ספריות לקוח של Cloud Firestore.
Unity
DocumentReference documentRef = db.Document("users/alovelace");
C#
C#
מידע נוסף על התקנה ויצירה של לקוח Cloud Firestore זמין במאמר ספריות לקוח של Cloud Firestore.
Ruby
נתונים היררכיים
כדי להבין איך מבנים היררכיים של נתונים פועלים ב-Cloud Firestore, נבחן דוגמה לאפליקציית צ'אט עם הודעות וחדרי צ'אט.
אפשר ליצור אוסף בשם rooms
כדי לאחסן חדרי צ'אט שונים:
חדרים
roomA
name : "my chat room"
roomB
...
עכשיו, אחרי שיש לכם חדרי צ'אט, תוכלו להחליט איך לשמור את ההודעות. אולי לא תרצו לשמור אותם במסמך של חדר הצ'אט. המסמכים ב-Cloud Firestore צריכים להיות קלים, וחדר צ'אט יכול להכיל מספר רב של הודעות. עם זאת, אפשר ליצור אוספים נוספים במסמך של חדר הצ'אט, בתור אוספים משניים.
אוספי משנה
הדרך הטובה ביותר לאחסן הודעות בתרחיש הזה היא באמצעות אוספי משנה. אוסף משנה הוא אוסף שמשויך למסמך ספציפי.
אפשר ליצור אוסף משנה בשם messages
לכל מסמך של חדר באוסף rooms
:
חדרים
חדר אחד (
)name : "my chat room"
הודעות
message1
from : "alex"
msg : "Hello World!"
הודעה2
...
roomB
...
בדוגמה הזו, יוצרים הפניה להודעה באוסף המשנה באמצעות הקוד הבא:
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
Go
PHP
PHP
מידע נוסף על התקנה ויצירה של לקוח Cloud Firestore זמין במאמר ספריות לקוח של Cloud Firestore.
Unity
DocumentReference documentRef = db .Collection("Rooms").Document("RoomA") .Collection("Messages").Document("Message1");
C#
C#
מידע נוסף על התקנה ויצירה של לקוח Cloud Firestore זמין במאמר ספריות לקוח של Cloud Firestore.
Ruby
שימו לב לדפוס המנוגד של אוספים ומסמכים. האוספים והמסמכים תמיד צריכים לפעול לפי התבנית הזו. אי אפשר להפנות לאוסף באוסף או למסמך במסמך.
באמצעות אוספי משנה אפשר לארגן את הנתונים באופן היררכי, וכך להקל על הגישה אליהם. כדי לקבל את כל ההודעות ב-roomA
, אפשר ליצור הפניה לאוסף של אוסף המשנה messages
ולבצע איתה פעולות כמו עם כל הפניה אחרת לאוסף.
מסמכים באוספים משניים יכולים להכיל גם אוספים משניים, וכך תוכלו להטמיע את הנתונים עוד יותר. אפשר להציב נתונים עד 100 רמות לעומק.