Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

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

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

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

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

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

מסמכים

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

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

  • שרוך

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

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

  • שרוך

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

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

אוספים

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

  • משתמשי

    • שרוך

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

    • סיור

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

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

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

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

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

הפניות

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

אינטרנט v8

var alovelaceDocumentRef = db.collection('users').doc('alovelace');

אינטרנט v9

import { doc } from "firebase/firestore";

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

ג'אווה

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

Kotlin + 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')
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")

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

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

אינטרנט v8

var usersCollectionRef = db.collection('users');

אינטרנט v9

import { collection } from "firebase/firestore";

const usersCollectionRef = collection(db, 'users');
מָהִיר
let usersCollectionRef = db.collection("users")
מטרה-ג
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

ג'אווה

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

Kotlin + KTX

val usersCollectionRef = db.collection("users")
ג'אווה
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
פִּיתוֹן
users_ref = db.collection(u'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 :

אינטרנט v8

var alovelaceDocumentRef = db.doc('users/alovelace');

אינטרנט v9

import { doc } from "firebase/firestore"; 

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

ג'אווה

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

Kotlin + 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')
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"

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

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

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

  • חדרים

    • A.

      name : "my chat room"

    • B.

      ...

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

אוספי משנה

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

אתה יכול ליצור אוסף משנה שנקרא messages עבור כל מסמך rooms באוסף rooms שלך:

  • חדרים

    • A.

      name : "my chat room"

      • הודעות

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

        • הודעה 2

          ...

    • B.

      ...

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

אינטרנט v8

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');

אינטרנט v9

import { doc } from "firebase/firestore"; 

const messageRef = doc(db, "rooms", "roomA", "messages", "message1");
מָהִיר
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
מטרה-ג
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];

ג'אווה

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

Kotlin + 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')
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 , אתה יכול ליצור הפניה לאוסף messages אוסף המשנה ולתקשר איתה כמו בכל הפניה אחרת לאוסף.

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