वेब पर डेटा की सूचियों के साथ काम करना

डेटाबेस का रेफ़रंस पाना

डेटाबेस से डेटा पढ़ने या उसमें डेटा लिखने के लिए, आपके पास firebase.database.Reference का एक इंस्टेंस होना चाहिए:

Web

import { getDatabase } from "firebase/database";

const database = getDatabase();

Web

var database = firebase.database();

सूचियां पढ़ना और उनमें बदलाव करना

डेटा की सूची में जोड़ना

कई उपयोगकर्ताओं वाले ऐप्लिकेशन में, सूची में डेटा जोड़ने के लिए push() तरीके का इस्तेमाल करें. push() तरीका, तय किए गए Firebase रेफ़रंस में हर बार एक नया चाइल्ड जोड़ने पर एक यूनीक पासकोड जनरेट करता है. सूची में मौजूद हर नए एलिमेंट के लिए, अपने-आप जनरेट हुई इन कुंजियों का इस्तेमाल करके, कई क्लाइंट एक ही समय पर एक ही जगह पर चाइल्ड जोड़ सकते हैं. ऐसा करने पर, डेटा को लिखने में कोई समस्या नहीं होती. push() के ज़रिए जनरेट किया गया यूनीक पासकोड, टाइमस्टैंप पर आधारित होता है. इसलिए, सूची के आइटम अपने-आप कालांतर के हिसाब से क्रम में लग जाते हैं.

push() तरीके से मिले नए डेटा के रेफ़रंस का इस्तेमाल करके, चाइल्ड की अपने-आप जनरेट हुई कुंजी की वैल्यू पाई जा सकती है या चाइल्ड के लिए डेटा सेट किया जा सकता है. push() रेफ़रंस की .key प्रॉपर्टी में, अपने-आप जनरेट हुई कुंजी होती है.

अपने-आप जनरेट हुई इन कुंजियों का इस्तेमाल करके, डेटा स्ट्रक्चर को आसानी से फ़्लैट किया जा सकता है. ज़्यादा जानकारी के लिए, डेटा फ़ैन-आउट का उदाहरण देखें.

उदाहरण के लिए, push() का इस्तेमाल किसी सोशल ऐप्लिकेशन में, पोस्ट की सूची में नई पोस्ट जोड़ने के लिए किया जा सकता है:

Web

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

// 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

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

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

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

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

यह पैटर्न तब मददगार हो सकता है, जब आपको किसी सूची के सभी चाइल्ड को एक ही ऑपरेशन में फ़ेच करना हो. इसके बजाय, आपको चाइल्ड जोड़े जाने के अतिरिक्त इवेंट को सुनना पड़ता है.

डेटा को क्रम से लगाना और फ़िल्टर करना

Realtime Database Query क्लास का इस्तेमाल करके, क्रम से लगाए गए डेटा को ऐक्सेस किया जा सकता है. जैसे, कुंजी, वैल्यू या चाइल्ड की वैल्यू के हिसाब से. क्रम में लगाए गए नतीजों को, किसी खास संख्या के नतीजों या कुंजियों या वैल्यू की सीमा के हिसाब से भी फ़िल्टर किया जा सकता है.

डेटा को क्रम से लगाना

क्रम से लगाए गए डेटा को वापस पाने के लिए, क्रम से लगाने के लिए इनमें से किसी एक तरीके का इस्तेमाल करें, ताकि यह तय किया जा सके कि नतीजों को किस क्रम में लगाया जाए:

तरीका इस्तेमाल
orderByChild() किसी खास चाइल्ड की की या नेस्ट किए गए चाइल्ड पाथ की वैल्यू के हिसाब से नतीजों को क्रम में लगाएं.
orderByKey() नतीजों को चाइल्ड बटन के हिसाब से क्रम में लगाएं.
orderByValue() नतीजों को चाइल्ड वैल्यू के हिसाब से क्रम में लगाएं.

एक बार में, क्रम से लगाने के लिए सिर्फ़ एक तरीके का इस्तेमाल किया जा सकता है. एक ही क्वेरी में, क्रम से लगाने के तरीके को कई बार कॉल करने पर गड़बड़ी का मैसेज मिलता है.

इस उदाहरण में, किसी उपयोगकर्ता की सबसे लोकप्रिय पोस्ट की सूची को सितारों की संख्या के हिसाब से क्रम से लगाने का तरीका बताया गया है:

Web

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

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

यह एक ऐसी क्वेरी तय करती है जिसे चाइल्ड लिसनर के साथ जोड़ने पर, क्लाइंट को उपयोगकर्ता के पोस्ट के साथ सिंक किया जाता है. यह सिंक, डेटाबेस में मौजूद पाथ से किया जाता है. यह सिंक, उपयोगकर्ता के User-ID के आधार पर किया जाता है. साथ ही, हर पोस्ट को मिले स्टार की संख्या के हिसाब से क्रम में लगाया जाता है. आईडी को इंडेक्स कुंजियों के तौर पर इस्तेमाल करने की इस तकनीक को डेटा फ़ैन आउट कहा जाता है. इस बारे में ज़्यादा जानने के लिए, अपना डेटाबेस व्यवस्थित करना लेख पढ़ें.

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

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

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

Web

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

अन्य डेटा टाइप को क्रम से लगाने के तरीके के बारे में ज़्यादा जानने के लिए, क्वेरी डेटा को क्रम से लगाने का तरीका लेख पढ़ें.

डेटा फ़िल्टर करना

डेटा को फ़िल्टर करने के लिए, क्वेरी बनाते समय, सीमित या रेंज वाले किसी भी तरीके को क्रम से लगाने के तरीके के साथ जोड़ा जा सकता है.

तरीका इस्तेमाल
limitToFirst() इससे, क्रम से लगाई गई नतीजों की सूची में सबसे पहले से दिखाए जाने वाले आइटम की ज़्यादा से ज़्यादा संख्या तय की जाती है.
limitToLast() क्रम से लगाए गए नतीजों की सूची के आखिर से दिखाए जाने वाले आइटम की ज़्यादा से ज़्यादा संख्या सेट करता है.
startAt() चुने गए क्रम के तरीके के आधार पर, तय की गई कुंजी या वैल्यू से ज़्यादा या उसके बराबर वाले आइटम दिखाता है.
startAfter() चुने गए क्रम के तरीके के आधार पर, तय की गई कुंजी या वैल्यू से ज़्यादा आइटम दिखाता है.
endAt() चुने गए क्रम के तरीके के आधार पर, तय की गई कुंजी या वैल्यू से कम या उसके बराबर वाले आइटम दिखाता है.
endBefore() चुने गए क्रम के तरीके के आधार पर, तय की गई कुंजी या वैल्यू से कम आइटम दिखाता है.
equalTo() चुने गए क्रम के हिसाब से, तय की गई कुंजी या वैल्यू के बराबर आइटम दिखाता है.

क्रम से लगाने के तरीकों के उलट, कई सीमाएं या रेंज फ़ंक्शन जोड़े जा सकते हैं. उदाहरण के लिए, नतीजों को वैल्यू की तय सीमा तक सीमित करने के लिए, startAt() और endAt() तरीकों को जोड़ा जा सकता है.

नतीजों की संख्या सीमित करना

किसी इवेंट के लिए, सिंक किए जाने वाले चाइल्ड एलिमेंट की ज़्यादा से ज़्यादा संख्या सेट करने के लिए, limitToFirst() और limitToLast() तरीकों का इस्तेमाल किया जा सकता है. उदाहरण के लिए, अगर आपने 100 की सीमा सेट करने के लिए limitToFirst() का इस्तेमाल किया है, तो शुरुआत में आपको सिर्फ़ 100 child_added इवेंट मिलेंगे. अगर आपके Firebase डेटाबेस में 100 से कम आइटम सेव हैं, तो हर आइटम के लिए एक child_added इवेंट ट्रिगर होता है.

आइटम में बदलाव होने पर, आपको क्वेरी में शामिल होने वाले आइटम के लिए child_added इवेंट और उससे बाहर निकलने वाले आइटम के लिए child_removed इवेंट मिलते हैं, ताकि कुल संख्या 100 पर बनी रहे.

यहां दिए गए उदाहरण में दिखाया गया है कि ब्लॉगिंग ऐप्लिकेशन, सभी उपयोगकर्ताओं की सबसे हाल की 100 पोस्ट की सूची पाने के लिए क्वेरी कैसे तय करता है:

Web

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

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

Web

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. स्ट्रिंग, संख्याओं के बाद आती हैं और उन्हें अंग्रेज़ी के वर्णमाला के हिसाब से, बढ़ते क्रम में लगाया जाता है. अगर कई चाइल्ड के लिए, तय किए गए चाइल्ड node की एक ही वैल्यू है, तो उन्हें कीवर्ड के हिसाब से, वर्णमाला के क्रम में लगाया जाता है.
  6. ऑब्जेक्ट आखिर में आते हैं और उन्हें बढ़ते क्रम में, कीवर्ड के हिसाब से क्रम में लगाया जाता है.

orderByKey

डेटा को क्रम से लगाने के लिए orderByKey() का इस्तेमाल करने पर, डेटा को बढ़ते क्रम में दिखाया जाता है.

  1. जिन बच्चों की कुंजी को 32-बिट के पूर्णांक के तौर पर पार्स किया जा सकता है वे सबसे पहले दिखते हैं. साथ ही, उन्हें बढ़ते क्रम में क्रम से लगाया जाता है.
  2. इसके बाद, उन बच्चों की जानकारी दिखती है जिनके लिए कुंजी के तौर पर स्ट्रिंग वैल्यू दी गई है. इन बच्चों की जानकारी को वर्णमाला के क्रम में, बढ़ते क्रम में लगाया जाता है.

orderByValue

orderByValue() का इस्तेमाल करने पर, बच्चों को उनकी वैल्यू के हिसाब से क्रम में लगाया जाता है. क्रम से लगाने की शर्तें, orderByChild() में बताई गई शर्तों जैसी ही होती हैं. हालांकि, किसी चाइल्ड की वैल्यू के बजाय नोड की वैल्यू का इस्तेमाल किया जाता है.

लिसनर को अलग करना

कॉलबैक हटाने के लिए, अपने Firebase डेटाबेस रेफ़रंस पर off() तरीके को कॉल करें.

किसी एक दर्शक को हटाने के लिए, उसे off() के पैरामीटर के तौर पर पास करें. किसी जगह के लिए off() को बिना किसी आर्ग्युमेंट के कॉल करने पर, उस जगह पर मौजूद सभी दर्शकों को हटा दिया जाता है.

किसी पैरंट लिसनर पर off() को कॉल करने से, उसके चाइल्ड नोड पर रजिस्टर किए गए लिसनर अपने-आप नहीं हटते. कॉलबैक हटाने के लिए, चाइल्ड लिसनर पर भी off() को कॉल करना होगा.

अगले चरण