डेटाबेस का रेफ़रंस पाना
डेटाबेस से डेटा पढ़ने या उसमें डेटा लिखने के लिए, आपके पास firebase.database.Reference
का एक इंस्टेंस होना चाहिए:
import { getDatabase } from "firebase/database"; const database = getDatabase();
var database = firebase.database();
सूचियां पढ़ना और उनमें बदलाव करना
डेटा की सूची में जोड़ना
कई उपयोगकर्ताओं वाले ऐप्लिकेशन में, सूची में डेटा जोड़ने के लिए push()
तरीके का इस्तेमाल करें.
push()
तरीका, तय किए गए Firebase रेफ़रंस में हर बार एक नया चाइल्ड जोड़ने पर एक यूनीक पासकोड जनरेट करता है. सूची में मौजूद हर नए एलिमेंट के लिए, अपने-आप जनरेट हुई इन कुंजियों का इस्तेमाल करके, कई क्लाइंट एक ही समय पर एक ही जगह पर चाइल्ड जोड़ सकते हैं. ऐसा करने पर, डेटा को लिखने में कोई समस्या नहीं होती. push()
के ज़रिए जनरेट किया गया यूनीक पासकोड, टाइमस्टैंप पर आधारित होता है. इसलिए, सूची के आइटम अपने-आप कालांतर के हिसाब से क्रम में लग जाते हैं.
push()
तरीके से मिले नए डेटा के रेफ़रंस का इस्तेमाल करके, चाइल्ड की अपने-आप जनरेट हुई कुंजी की वैल्यू पाई जा सकती है या चाइल्ड के लिए डेटा सेट किया जा सकता है. push()
रेफ़रंस की .key
प्रॉपर्टी में, अपने-आप जनरेट हुई कुंजी होती है.
अपने-आप जनरेट हुई इन कुंजियों का इस्तेमाल करके, डेटा स्ट्रक्चर को आसानी से फ़्लैट किया जा सकता है. ज़्यादा जानकारी के लिए, डेटा फ़ैन-आउट का उदाहरण देखें.
उदाहरण के लिए, push()
का इस्तेमाल किसी सोशल ऐप्लिकेशन में पोस्ट की सूची में नई पोस्ट जोड़ने के लिए किया जा सकता है:
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, { // ... });
// 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 |
आइटम की सूचियां वापस पाएं या आइटम की सूची में जोड़े गए आइटम सुनें. यह इवेंट, हर मौजूदा चाइल्ड के लिए एक बार ट्रिगर होता है. इसके बाद, तय किए गए पाथ में हर बार नया चाइल्ड जोड़े जाने पर, यह इवेंट फिर से ट्रिगर होता है. नए बच्चे का डेटा इकट्ठा करने के बाद, उसे Listener को भेजा जाता है. |
child_changed |
सूची में मौजूद आइटम में होने वाले बदलावों को सुनना. जब भी किसी चाइल्ड नोड में बदलाव किया जाता है, तो यह इवेंट ट्रिगर होता है. इसमें ये बदलाव भी शामिल हैं: चाइल्ड नोड के वंशजों में किए गए बदलाव. इवेंट लिसनर को भेजे गए स्नैपशॉट में, चाइल्ड के लिए अपडेट किया गया डेटा होता है. |
child_removed |
किसी सूची से आइटम हटाए जाने की जानकारी सुनना. यह इवेंट तब ट्रिगर होता है, जब किसी चाइल्ड को तुरंत हटाया जाता है.कॉलबैक ब्लॉक में भेजे गए स्नैपशॉट में, हटाए गए चाइल्ड का डेटा होता है. |
child_moved |
क्रम से लगाई गई सूची में आइटम के क्रम में होने वाले बदलावों को सुनना.
child_moved इवेंट हमेशा उस
child_changed इवेंट के बाद होते हैं जिसकी वजह से आइटम का ऑर्डर बदला है. यह बदलाव, ऑर्डर के लिए इस्तेमाल किए जा रहे मौजूदा तरीके के आधार पर होता है.
|
इनमें से हर एक का इस्तेमाल, डेटाबेस में किसी खास नोड में होने वाले बदलावों को सुनने के लिए किया जा सकता है. उदाहरण के लिए, कोई सोशल ब्लॉगिंग ऐप्लिकेशन, किसी पोस्ट की टिप्पणियों में होने वाली गतिविधि को मॉनिटर करने के लिए, इन तरीकों का एक साथ इस्तेमाल कर सकता है, जैसा कि यहां दिखाया गया है:
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); });
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
ऑब्ज़र्वर अटैच करने पर, डेटा की पूरी सूची एक स्नैपशॉट के तौर पर दिखेगी. इसके बाद, अलग-अलग बच्चों को ऐक्सेस करने के लिए, इस सूची को लूप किया जा सकता है.
अगर क्वेरी के लिए सिर्फ़ एक मैच है, तब भी स्नैपशॉट एक सूची होती है. इसमें सिर्फ़ एक आइटम होता है. आइटम को ऐक्सेस करने के लिए, आपको नतीजे पर बार-बार क्लिक करना होगा:
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 });
ref.once('value', (snapshot) => { snapshot.forEach((childSnapshot) => { var childKey = childSnapshot.key; var childData = childSnapshot.val(); // ... }); });
यह पैटर्न तब फ़ायदेमंद हो सकता है, जब आपको किसी सूची के सभी चाइल्ड को एक ही ऑपरेशन में फ़ेच करना हो. इसके बजाय, आपको चाइल्ड जोड़े जाने के अतिरिक्त इवेंट को सुनना पड़ता है.
डेटा को क्रम से लगाना और फ़िल्टर करना
Realtime Database Query
क्लास का इस्तेमाल करके, क्रम से लगाए गए डेटा को ऐक्सेस किया जा सकता है. जैसे, कुंजी, वैल्यू या चाइल्ड की वैल्यू के हिसाब से. क्रम में लगाए गए नतीजों को, किसी खास संख्या के नतीजों या कुंजियों या वैल्यू की सीमा के हिसाब से भी फ़िल्टर किया जा सकता है.
डेटा को क्रम से लगाना
क्रम से लगाए गए डेटा को वापस पाने के लिए, क्रम से लगाने के लिए इनमें से किसी एक तरीके का इस्तेमाल करें, ताकि यह तय किया जा सके कि नतीजों को किस क्रम में लगाया जाए:
तरीका | इस्तेमाल |
---|---|
orderByChild() |
किसी खास चाइल्ड कुंजी या नेस्ट किए गए चाइल्ड पाथ की वैल्यू के हिसाब से नतीजों को क्रम में लगाएं. |
orderByKey()
| नतीजों को चाइल्ड बटन के हिसाब से क्रम में लगाएं. |
orderByValue() |
नतीजों को चाइल्ड वैल्यू के हिसाब से क्रम में लगाएं. |
एक बार में, क्रम से लगाने के लिए सिर्फ़ एक तरीके का इस्तेमाल किया जा सकता है. एक ही क्वेरी में, क्रम से लगाने के तरीके को कई बार कॉल करने पर गड़बड़ी का मैसेज मिलता है.
इस उदाहरण में बताया गया है कि किसी उपयोगकर्ता की सबसे लोकप्रिय पोस्ट की सूची को, स्टार की संख्या के हिसाब से कैसे क्रम में लगाया जा सकता है:
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'));
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()
कॉल में नेस्ट किए गए चाइल्ड के रिलेटिव पाथ की जानकारी देनी होगी.
import { getDatabase, ref, query, orderByChild } from "firebase/database"; const db = getDatabase(); const mostViewedPosts = query(ref(db, 'posts'), orderByChild('metrics/views'));
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 पोस्ट की सूची पाने के लिए क्वेरी कैसे तय करता है:
import { getDatabase, ref, query, limitToLast } from "firebase/database"; const db = getDatabase(); const recentPostsRef = query(ref(db, 'posts'), limitToLast(100));
var recentPostsRef = firebase.database().ref('posts').limitToLast(100);
इस उदाहरण में सिर्फ़ एक क्वेरी दी गई है. डेटा को सिंक करने के लिए, उसमें लिसनर जोड़ना ज़रूरी है.
बटन या वैल्यू के हिसाब से फ़िल्टर करना
startAt()
, startAfter()
,endAt()
, endBefore()
, और
equalTo()
का इस्तेमाल करके, क्वेरी के लिए अपनी पसंद के मुताबिक शुरुआती, आखिरी, और मिलते-जुलते पॉइंट चुने जा सकते हैं. यह डेटा को पेज के हिसाब से बांटने या ऐसे आइटम ढूंढने के लिए मददगार हो सकता है जिनके चाइल्ड एलिमेंट की कोई खास वैल्यू हो.
क्वेरी डेटा को क्रम से लगाने का तरीका
इस सेक्शन में बताया गया है कि Query
क्लास में, क्रम से लगाने के हर तरीके के हिसाब से डेटा को कैसे क्रम से लगाया जाता है.
orderByChild
orderByChild()
का इस्तेमाल करने पर, उस डेटा को इस क्रम में लगाया जाता है जिसमें तय की गई चाइल्ड कुंजी शामिल होती है:
- जिन बच्चों के लिए दी गई चाइल्ड की कीमत
null
है वे सबसे पहले दिखते हैं. - इसके बाद, तय की गई चाइल्ड कुंजी के लिए
false
वैल्यू वाले बच्चे आते हैं. अगर एक से ज़्यादा चाइल्ड एलिमेंट की वैल्यूfalse
है, तो उन्हें की के हिसाब से लेक्सिकोग्राफ़ी के हिसाब से क्रम में लगाया जाता है. - इसके बाद, तय की गई चाइल्ड कुंजी के लिए
true
वैल्यू वाले बच्चे आते हैं. अगर एक से ज़्यादा चाइल्ड एलिमेंट की वैल्यूtrue
है, तो उन्हें कीवर्ड के हिसाब से, वर्णमाला के क्रम में क्रम से लगाया जाता है. - इसके बाद, संख्या वाली वैल्यू वाले बच्चे आते हैं. इन्हें बढ़ते क्रम में लगाया जाता है. अगर एक से ज़्यादा चाइल्ड के लिए, तय किए गए चाइल्ड नोड की संख्या वाली वैल्यू एक जैसी है, तो उन्हें कीवर्ड के हिसाब से क्रम में लगाया जाता है.
- स्ट्रिंग, संख्याओं के बाद आती हैं और उन्हें अंग्रेज़ी के वर्णमाला के क्रम में, बढ़ते क्रम में लगाया जाता है. अगर कई चाइल्ड के लिए, तय किए गए चाइल्ड node की एक ही वैल्यू है, तो उन्हें कीवर्ड के हिसाब से, वर्णमाला के क्रम में लगाया जाता है.
- ऑब्जेक्ट आखिर में आते हैं और उन्हें बढ़ते क्रम में, कीवर्ड के हिसाब से क्रम में लगाया जाता है.
orderByKey
डेटा को क्रम से लगाने के लिए orderByKey()
का इस्तेमाल करने पर, डेटा को बढ़ते क्रम में दिखाया जाता है.
- जिन बच्चों की कुंजी को 32-बिट के पूर्णांक के तौर पर पार्स किया जा सकता है वे सबसे पहले दिखते हैं. साथ ही, उन्हें बढ़ते क्रम में क्रम से लगाया जाता है.
- इसके बाद, उन बच्चों की जानकारी दिखती है जिनके लिए कुंजी के तौर पर स्ट्रिंग वैल्यू दी गई है. इन बच्चों की जानकारी को वर्णमाला के क्रम में, बढ़ते क्रम में लगाया जाता है.
orderByValue
orderByValue()
का इस्तेमाल करने पर, बच्चों को उनकी वैल्यू के हिसाब से क्रम में लगाया जाता है. क्रम से लगाने की शर्तें, orderByChild()
में बताई गई शर्तों जैसी ही होती हैं. हालांकि, किसी चाइल्ड की वैल्यू के बजाय नोड की वैल्यू का इस्तेमाल किया जाता है.
लिसनर को अलग करना
कॉलबैक हटाने के लिए, अपने Firebase डेटाबेस रेफ़रंस पर off()
तरीके को कॉल करें.
किसी एक दर्शक को हटाने के लिए, उसे off()
के पैरामीटर के तौर पर पास करें.
किसी जगह के लिए off()
को बिना किसी आर्ग्युमेंट के कॉल करने पर, उस जगह पर मौजूद सभी दर्शक हट जाते हैं.
किसी पैरंट लिसनर पर off()
को कॉल करने से, उसके चाइल्ड नोड पर रजिस्टर किए गए लिसनर अपने-आप नहीं हटते. कॉलबैक हटाने के लिए, चाइल्ड लिसनर पर भी off()
को कॉल करना होगा.