Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

מודל נתונים של Firestore בענן

Cloud Firestore הוא מסד נתונים NoSQL, מונחה מסמכים. שלא כמו מסד נתונים של SQL, אין טבלאות או שורות. במקום זאת, אתה לאחסן נתונים ומסמכים, אשר מאורגנים לאוספים.

כל מסמך המכיל קבוצה של זוגות מפתח-ערך. Cloud Firestore מותאם לאחסון אוספים גדולים של מסמכים קטנים.

יש לאחסן את כל המסמכים באוספים. מסמכים יכולים להכיל מהתת-אוסף וחפצים מקוננים, אשר שניהם יכולים לכלול שדות פרימיטיווי כמו מחרוזות או עצמים מורכבים כמו רשימות.

אוספים ומסמכים נוצרים במשתמע ב- Cloud Firestore. כל שעליך לעשות הוא להקצות נתונים למסמך בתוך אוסף. אם האוסף או המסמך אינם קיימים, Cloud Firestore יוצר אותו.

מסמכים

ב- Cloud Firestore יחידת האחסון היא המסמך. מסמך הוא רשומה קלה המכילה שדות, הממפות לערכים. כל מסמך מזוהה בשם.

מסמך המייצג משתמש alovelace עשוי להיראות כך:

  • alovelace

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

אובייקטים מורכבים ומקוננים במסמך נקראים מפות. לדוגמה, תוכל לבנות את שם המשתמש מהדוגמה למעלה באמצעות מפה, כך:

  • alovelace

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

ייתכן שתבחין שמסמכים דומים מאוד ל- JSON. למעשה, הם בעצם כך. ישנם כמה הבדלים (לדוגמה, מסמכים תומכים בסוגי נתונים נוספים והם מוגבלים בגודל של 1 MB), אך באופן כללי ניתן להתייחס למסמכים כאל רשומות JSON קלות משקל.

אוספים

מסמכים חיים באוספים, שהם פשוט מכולות למסמכים. לדוגמה, אתה יכול להיות users אוספים להכיל המשתמשים השונים שלך, כול אחד מהם מיוצג על ידי מסמך:

  • משתמש

    • alovelace

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

    • aturing

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

Cloud Firestore הוא ללא תוכניות, כך שיש לך חופש מוחלט לגבי אילו שדות אתה שם בכל מסמך ואילו סוגי נתונים אתה מאחסן בשדות אלה. מסמכים בתוך אותו אוסף יכולים כולם להכיל שדות שונים או לאחסן סוגי נתונים שונים בשדות אלה. עם זאת, מומלץ להשתמש באותם שדות וסוגי נתונים במספר מסמכים, כך שתוכל לבצע שאילתות במסמכים ביתר קלות.

אוסף מכיל מסמכים ותו לא. הוא אינו יכול להכיל שדות גולמיים ישירים עם ערכים, ואינו יכול להכיל אוספים אחרים. (ראה נתונים היררכיים הסבר כיצד מבנה נתונים מורכבים יותר קלאוד firestore.)

שמות המסמכים בתוך אוסף הם ייחודיים. תוכל לספק מפתחות משלך, כגון מזהי משתמש, או שתוכל לתת ל- Cloud Firestore ליצור עבורך מזהים אקראיים באופן אוטומטי.

אינך צריך "ליצור" או "למחוק" אוספים. לאחר שתיצור את המסמך הראשון באוסף, האוסף קיים. אם תמחק את כל המסמכים באוסף, הוא כבר לא קיים.

הפניות

כל מסמך ב- Cloud Firestore מזוהה באופן ייחודי לפי מיקומו בתוך מסד הנתונים. הדוגמה הקודמת הראתה מסמך alovelace בתוך אוסף users . כדי להתייחס למיקום זה בקוד שלך, אתה יכול ליצור הפניה אליו.

גרסת אינטרנט 9

import { doc } from "firebase/firestore";

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

גרסת אינטרנט 8

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
מָהִיר
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Objective-C
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];

ג'אווה

DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");

קוטלין+KTX

val alovelaceDocumentRef = db.collection("users").document("alovelace")
ג'אווה
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
פִּיתוֹן
a_lovelace_ref = db.collection(u'users').document(u'alovelace')

פִּיתוֹן

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');
ללכת
alovelaceRef := client.Collection("users").Doc("alovelace")
PHP
$document = $db->collection('samples/php/users')->document('lovelace');
אַחְדוּת
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
DocumentReference documentRef = db.Collection("users").Document("alovelace");
אוֹדֶם
document_ref = firestore.col("users").doc("alovelace")

הפניה היא אובייקט קל משקל המצביע רק על מיקום במסד הנתונים שלך. אתה יכול ליצור הפניה בין אם קיימים שם נתונים ובין אם לא, ויצירת הפניה לא מבצעת פעולות רשת.

ניתן גם ליצור אזכור אוספים:

גרסת אינטרנט 9

import { collection } from "firebase/firestore";

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

גרסת אינטרנט 8

var usersCollectionRef = db.collection('users');
מָהִיר
let usersCollectionRef = db.collection("users")
Objective-C
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

ג'אווה

CollectionReference usersCollectionRef = db.collection("users");

קוטלין+KTX

val usersCollectionRef = db.collection("users")
ג'אווה
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
פִּיתוֹן
users_ref = db.collection(u'users')

פִּיתוֹן

users_ref = db.collection("users")
C ++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
ללכת
usersRef := client.Collection("users")
PHP
$collection = $db->collection('samples/php/users');
אַחְדוּת
CollectionReference collectionRef = db.Collection("users");
C#
CollectionReference collectionRef = db.Collection("users");
אוֹדֶם
collection_ref = firestore.col "users"

לנוחיותכם, ניתן גם ליצור הפניות על ידי ציון הנתיב למסמך או אוסף כמחרוזת, עם רכיבים נתיב מופרדים באמצעות קו נטוי ( / ). לדוגמה, כדי ליצור התייחסות alovelace המסמך:

גרסת אינטרנט 9

import { doc } from "firebase/firestore"; 

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

גרסת אינטרנט 8

var alovelaceDocumentRef = db.doc('users/alovelace');
מָהִיר
let aLovelaceDocumentReference = db.document("users/alovelace")
Objective-C
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

ג'אווה

DocumentReference alovelaceDocumentRef = db.document("users/alovelace");

קוטלין+KTX

val alovelaceDocumentRef = db.document("users/alovelace")
ג'אווה
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
פִּיתוֹן
a_lovelace_ref = db.document(u'users/alovelace')

פִּיתוֹן

a_lovelace_ref = db.document("users/alovelace")
C ++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
const alovelaceDocumentRef = db.doc('users/alovelace');
ללכת
alovelaceRef := client.Doc("users/alovelace")
PHP
$document = $db->document('users/lovelace');
אַחְדוּת
DocumentReference documentRef = db.Document("users/alovelace");
C#
DocumentReference documentRef = db.Document("users/alovelace");
אוֹדֶם
document_path_ref = firestore.doc "users/alovelace"

נתונים הירארכיים

כדי להבין כיצד מבני נתונים היררכיים פועלים ב- Cloud Firestore, שקול דוגמא לאפליקציית צ'אט עם הודעות וחדרי צ'אט.

אתה יכול ליצור אוסף שנקרא rooms לאחסון חדרי צ'אט שונים:

  • חדרים

    • roomA

      name : "my chat room"

    • roomB

      ...

עכשיו כשיש לך חדרי צ'אט, תחליט כיצד לאחסן את ההודעות שלך. ייתכן שלא תרצה לאחסן אותם במסמך של חדר הצ'אט. המסמכים ב- Cloud Firestore צריכים להיות קלים וחדר צ'אט יכול להכיל מספר רב של הודעות. עם זאת, תוכל ליצור אוספים נוספים בתוך המסמך של חדר הצ'אט שלך, כאוספי משנה.

אוספי משנה

הדרך הטובה ביותר לאחסן הודעות בתרחיש זה היא באמצעות אוספי משנה. אוסף משנה הוא אוסף המשויך למסמך ספציפי.

אתה יכול ליצור subcollection שנקרא messages לכל מסמך חדר שלך rooms לאוסף:

  • חדרים

    • roomA

      name : "my chat room"

      • הודעות

        • message1

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

        • message2

          ...

    • roomB

      ...

בדוגמה זו, תיצור הפניה להודעה באוסף המשנה עם הקוד הבא:

גרסת אינטרנט 9

import { doc } from "firebase/firestore"; 

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

גרסת אינטרנט 8

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
מָהִיר
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"];

ג'אווה

DocumentReference messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1");

קוטלין+KTX

val messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1")
ג'אווה
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
פִּיתוֹן
room_a_ref = db.collection(u'rooms').document(u'roomA')
message_ref = room_a_ref.collection(u'messages').document(u'message1')

פִּיתוֹן

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');
ללכת
messageRef := client.Collection("rooms").Doc("roomA").
	Collection("messages").Doc("message1")
PHP
$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
אַחְדוּת
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
C#
DocumentReference documentRef = db
    .Collection("Rooms").Document("RoomA")
    .Collection("Messages").Document("Message1");
אוֹדֶם
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

שימו לב לדפוס המתחלף של אוספים ומסמכים. האוספים והמסמכים שלך חייבים תמיד לעקוב אחר דפוס זה. לא ניתן להתייחס לאוסף באוסף או למסמך במסמך.

אוספי משנה מאפשרים לך לבנות נתונים בצורה היררכית, מה שהופך את הגישה לנתונים לקלה יותר. כדי לקבל את כל ההודעות roomA , אתה יכול ליצור הפניה אוסף אל subcollection messages ולקיים אינטראקציה איתו כמו אל כל התייחסות איסוף אחרות.

מסמכים באוספי משנה יכולים להכיל גם אוספי משנה, ומאפשרים לך לקנן עוד נתונים. אתה יכול לקנן נתונים בעומק של עד 100 רמות.