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

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

डेटाबेस से डेटा पढ़ने या उसमें कुछ लिखने के लिए, आपको 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 इवेंट के बाद होते हैं. 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');

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

orderByChild() तरीके को कॉल करने पर, वह चाइल्ड कुंजी तय की जाती है जिसके हिसाब से नतीजों को क्रम से लगाना है. इस मामले में, पोस्ट को उनके respective "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() तरीकों का इस्तेमाल किया जा सकता है. उदाहरण के लिए, अगर limitToFirst() का इस्तेमाल करके 100 की सीमा सेट की जाती है, तो आपको शुरुआती तौर पर सिर्फ़ 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. स्ट्रिंग, नंबर के बाद आती हैं और इन्हें बढ़ते क्रम में लेक्सिकोग्राफ़िक क्रम में लगाया जाता है. अगर बताए गए चाइल्ड नोड के लिए, कई चाइल्ड की वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है.
  6. ऑब्जेक्ट सबसे आखिर में आते हैं और इन्हें बढ़ते क्रम में कुंजी के हिसाब से लेक्सिकोग्राफ़िक क्रम में लगाया जाता है.

orderByKey

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

  1. ऐसे चाइल्ड सबसे पहले आते हैं जिनकी कुंजी को 32-बिट इंटिजर के तौर पर पार्स किया जा सकता है. इन्हें बढ़ते क्रम में लगाया जाता है.
  2. इसके बाद, ऐसे चाइल्ड आते हैं जिनकी कुंजी के तौर पर स्ट्रिंग वैल्यू होती है. इन्हें बढ़ते क्रम में लेक्सिकोग्राफ़िक क्रम में लगाया जाता है.

orderByValue

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

लिसनर हटाना

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

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

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

अगले चरण