Check out what’s new from Firebase at Google I/O 2022. Learn more

עבודה עם רשימות נתונים באינטרנט

קבל הפניה למסד נתונים

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

Web version 9

import { getDatabase } from "firebase/database";

const database = getDatabase();

Web version 8

var database = firebase.database();

קריאה וכתיבה של רשימות

הוסף לרשימת נתונים

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

אתה יכול להשתמש בהפניה לנתונים החדשים המוחזרים על ידי שיטת push() כדי לקבל את הערך של המפתח שנוצר אוטומטית של הילד או להגדיר נתונים עבור הילד. המאפיין .key של הפניה push() מכיל את המפתח שנוצר אוטומטית.

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

לדוגמה, ניתן להשתמש ב- push() כדי להוסיף פוסט חדש לרשימת פוסטים באפליקציה חברתית:

Web version 9

import { getDatabase, ref, push, set } from "firebase/database";

// Create a new post reference with an auto-generated id
const db = getDatabase();
const postListRef = ref(db, 'posts');
const newPostRef = push(postListRef);
set(newPostRef, {
    // ...
});

Web version 8

// Create a new post reference with an auto-generated id
var postListRef = firebase.database().ref('posts');
var newPostRef = postListRef.push();
newPostRef.set({
    // ...
});

האזינו לאירועי ילדים

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

מִקרֶה שימוש אופייני
child_added אחזר רשימות של פריטים או האזנה לתוספות לרשימת פריטים. אירוע זה מופעל פעם אחת עבור כל ילד קיים ולאחר מכן שוב בכל פעם שילד חדש נוסף לנתיב שצוין. למאזין מועברת תמונת מצב המכילה את הנתונים של הילד החדש.
child_changed האזן לשינויים בפריטים ברשימה. אירוע זה מופעל בכל פעם שצומת צאצא משתנה. זה כולל שינויים כלשהם בצאצאים של צומת הילד. תמונת המצב שהועברה למאזין האירועים מכילה את הנתונים המעודכנים עבור הילד.
child_removed האזן לפריטים שהוסרו מרשימה. אירוע זה מופעל כאשר ילד מיידי מוסר. תמונת המצב המועברת לחסימה להתקשרות חוזרת מכילה את הנתונים עבור הילד שהוסר.
child_moved האזן לשינויים בסדר הפריטים ברשימה מסודרת. אירועי child_moved תמיד עוקבים אחר אירוע child_changed שגרם לשינוי ההזמנה של הפריט (בהתבסס על השיטה הנוכחית שלך לפי הזמנה).

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

Web version 9

import { getDatabase, ref, onChildAdded, onChildChanged, onChildRemoved } from "firebase/database";

const db = getDatabase();
const commentsRef = ref(db, 'post-comments/' + postId);
onChildAdded(commentsRef, (data) => {
  addCommentElement(postElement, data.key, data.val().text, data.val().author);
});

onChildChanged(commentsRef, (data) => {
  setCommentValues(postElement, data.key, data.val().text, data.val().author);
});

onChildRemoved(commentsRef, (data) => {
  deleteComment(postElement, data.key);
});

Web version 8

var commentsRef = firebase.database().ref('post-comments/' + postId);
commentsRef.on('child_added', (data) => {
  addCommentElement(postElement, data.key, data.val().text, data.val().author);
});

commentsRef.on('child_changed', (data) => {
  setCommentValues(postElement, data.key, data.val().text, data.val().author);
});

commentsRef.on('child_removed', (data) => {
  deleteComment(postElement, data.key);
});

הקשיבו לאירועים ערכיים

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

הצמדת צופה value לרשימת נתונים תחזיר את כל רשימת הנתונים כתמונת מצב בודדת, שאותה תוכל לאחר מכן לעבור בלולאה כדי לגשת לילדים בודדים.

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

Web version 9

import { getDatabase, ref, onValue } from "firebase/database";

const db = getDatabase();
const dbRef = ref(db, '/a/b/c');

onValue(dbRef, (snapshot) => {
  snapshot.forEach((childSnapshot) => {
    const childKey = childSnapshot.key;
    const childData = childSnapshot.val();
    // ...
  });
}, {
  onlyOnce: true
});

Web version 8

ref.once('value', (snapshot) => {
  snapshot.forEach((childSnapshot) => {
    var childKey = childSnapshot.key;
    var childData = childSnapshot.val();
    // ...
  });
});

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

מיון וסינון נתונים

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

מיון נתונים

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

שיטה נוֹהָג
orderByChild() סדר את התוצאות לפי הערך של מפתח צאצא או נתיב צאצא מקונן.
orderByKey() הזמנת תוצאות לפי מפתחות ילדים.
orderByValue() סדר תוצאות לפי ערכי צאצא.

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

הדוגמה הבאה מדגימה כיצד תוכל לאחזר רשימה של הפוסטים המובילים של משתמש ממוינת לפי ספירת הכוכבים שלו:

Web version 9

import { getDatabase, ref, query, orderByChild } from "firebase/database";
import { getAuth } from "firebase/auth";

const db = getDatabase();
const auth = getAuth();

const myUserId = auth.currentUser.uid;
const topUserPostsRef = query(ref(db, 'user-posts/' + myUserId), orderByChild('starCount'));

Web version 8

var myUserId = firebase.auth().currentUser.uid;
var topUserPostsRef = firebase.database().ref('user-posts/' + myUserId).orderByChild('starCount');

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

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

"posts": {
  "ts-functions": {
    "metrics": {
      "views" : 1200000,
      "likes" : 251000,
      "shares": 1200,
    },
    "title" : "Why you should use TypeScript for writing Cloud Functions",
    "author": "Doug",
  },
  "android-arch-3": {
    "metrics": {
      "views" : 900000,
      "likes" : 117000,
      "shares": 144,
    },
    "title" : "Using Android Architecture Components with Firebase Realtime Database (Part 3)",
    "author": "Doug",
  }
},

במקרה זה, נוכל לסדר את רכיבי הרשימה שלנו לפי ערכים המקוננים מתחת למפתח metrics על ידי ציון הנתיב היחסי לילד המקונן בקריאה שלנו orderByChild() .

Web version 9

import { getDatabase, ref, query, orderByChild } from "firebase/database";

const db = getDatabase();
const mostViewedPosts = query(ref(db, 'posts'), orderByChild('metrics/views'));

Web version 8

var mostViewedPosts = firebase.database().ref('posts').orderByChild('metrics/views');

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

סינון נתונים

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

שיטה נוֹהָג
limitToFirst() מגדיר את המספר המרבי של פריטים להחזרה מתחילת רשימת התוצאות המסומנת.
limitToLast() מגדיר את המספר המרבי של פריטים להחזרה מסוף רשימת התוצאות שהוזמנה.
startAt() החזר פריטים הגדולים או שווה למפתח או לערך שצוינו, בהתאם לשיטה לפי הזמנה שנבחרה.
startAfter() החזר פריטים הגדולים מהמפתח או הערך שצוינו בהתאם לשיטת ההזמנה לפי בחירה.
endAt() החזר פריטים הנמוכים או שווים למפתח או לערך שצוינו, בהתאם לשיטה לפי הזמנה שנבחרה.
endBefore() החזר פריטים הנמוכים מהמפתח או הערך שצוינו בהתאם לשיטה לפי הזמנה שנבחרה.
equalTo() החזר פריטים השווים למפתח או לערך שצוינו, בהתאם לשיטה לפי הזמנה שנבחרה.

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

הגבל את מספר התוצאות

אתה יכול להשתמש limitToFirst() ו- limitToLast() כדי להגדיר מספר מקסימלי של ילדים שיסונכרנו עבור אירוע נתון. לדוגמה, אם אתה משתמש ב- limitToFirst() כדי להגדיר מגבלה של 100, אתה מקבל בהתחלה רק עד 100 אירועי child_added . אם יש לך פחות מ-100 פריטים המאוחסנים במסד הנתונים שלך ב-Firebase, אירוע child_added מופעל עבור כל פריט.

כאשר פריטים משתנים, אתה מקבל אירועי child_added עבור פריטים שנכנסים לשאילתה ואירועי child_removed עבור פריטים שנפלטים ממנה כך שהמספר הכולל נשאר על 100.

הדוגמה הבאה מדגימה כיצד אפליקציית בלוגים לדוגמה מגדירה שאילתה לאחזור רשימה של 100 הפוסטים האחרונים של כל המשתמשים:

Web version 9

import { getDatabase, ref, query, limitToLast } from "firebase/database";

const db = getDatabase();
const recentPostsRef = query(ref(db, 'posts'), limitToLast(100));

Web version 8

var recentPostsRef = firebase.database().ref('posts').limitToLast(100);

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

סנן לפי מפתח או ערך

אתה יכול להשתמש ב- startAt() , startAfter() , endAt() , endBefore() ו- equalTo() כדי לבחור נקודות התחלה, סיום ושקילות שרירותיות עבור שאילתות. זה יכול להיות שימושי עבור עימוד נתונים או מציאת פריטים עם ילדים שיש להם ערך ספציפי.

כיצד מסודרים נתוני שאילתה

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

orderByChild

בעת שימוש ב- orderByChild() , הנתונים המכילים את מפתח הצאצא שצוין מסודרים באופן הבא:

  1. ילדים עם ערך null עבור מפתח הצאצא שצוין קודמים.
  2. ילדים עם ערך false עבור מפתח הצאצא שצוין מגיעים אחר כך. אם למספר ילדים יש ערך של false , הם ממוינים בלקסיקוגרפית לפי מפתח.
  3. ילדים עם הערך של true עבור מפתח הצאצא שצוין מגיעים לאחר מכן. אם למספר ילדים יש ערך של true , הם ממוינים בלקסיקוגרפית לפי מפתח.
  4. ילדים עם ערך מספרי מגיעים אחר כך, ממוינים בסדר עולה. אם למספר ילדים יש ערך מספרי זהה עבור צומת הילד שצוין, הם ממוינים לפי מפתח.
  5. מחרוזות באות אחרי מספרים וממוינות לקסיקוגרפית בסדר עולה. אם למספר ילדים יש ערך זהה עבור צומת הילד שצוין, הם מסודרים בלקסיקוגרפית לפי מפתח.
  6. אובייקטים מגיעים אחרונים וממוינים לקסיקוגרפית לפי מפתח בסדר עולה.

orderByKey

בעת שימוש ב- orderByKey() למיון הנתונים שלך, הנתונים מוחזרים בסדר עולה לפי מפתח.

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

orderByValue

בעת שימוש ב- orderByValue() , ילדים מסודרים לפי הערך שלהם. קריטריוני ההזמנה זהים ל- orderByChild() , אלא שהערך של הצומת משמש במקום הערך של מפתח צאצא שצוין.

לנתק מאזינים

התקשרויות חוזרות מוסרות על ידי קריאה לשיטה off() בהפניה למסד הנתונים שלך ב-Firebase.

אתה יכול להסיר מאזין בודד על ידי העברתו כפרמטר ל- off() . קריאת off() במיקום ללא ארגומנטים מסירה את כל המאזינים במיקום זה.

קריאת off() במאזין אב אינה מסירה אוטומטית מאזינים הרשומים בצמתי הצאצא שלו; off() חייב להיקרא גם על כל מאזיני ילדים כדי להסיר את ההתקשרות חזרה.

הצעדים הבאים