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

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

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

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

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

import { getDatabase } from "firebase/database";

const database = getDatabase();

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

var database = firebase.database();

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

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

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

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

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

לדוגמא, push() יכולה לשמש כדי להוסיף הודעה חדשה לרשימת הודעות יישום חברתי:

גרסת אינטרנט 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, {
    // ...
});

גרסת אינטרנט 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 האירוע שגרם הסדר של הפריט לשינוי (מבוסס על סדר-ידי נוכחי שיטה).

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

גרסת אינטרנט 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);
});

גרסת אינטרנט 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 משקיף אל רשימת הנתונים יחזיר את הרשימה המלאה של נתונים כתמונת מצב יחיד שבו אתה יכול אז לולאה מעל ל ילדים בודדים גישה.

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

גרסת אינטרנט 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
});

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

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

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

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

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

מיין נתונים

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

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

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

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

גרסת אינטרנט 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'));

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

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

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

הקריאה אל 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() השיחה.

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

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

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

גרסת אינטרנט 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 הפוסטים האחרונים של כל המשתמשים:

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

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

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

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

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

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

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

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

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

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

orderByChild

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

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

orderByKey

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

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

orderByValue

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

נתק מאזינים

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

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

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

הצעדים הבאים