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

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

डेटाबेस से डेटा पढ़ने या उसमें डेटा लिखने के लिए, आपके पास 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() को कॉल करना होगा.

अगले चरण