इस दस्तावेज़ में डेटाबेस डेटा को पाने की बुनियादी बातें, डेटा को क्रम से लगाने, और डेटा पर आसान क्वेरी करने के तरीके के बारे में बताया गया है. एडमिन SDK टूल में डेटा वापस पाने की प्रोसेस को, अलग-अलग प्रोग्रामिंग भाषाओं में थोड़ा अलग तरीके से लागू किया जाता है.
- एसिंक्रोनस लिसनर: Firebase रीयलटाइम डेटाबेस में सेव किए गए डेटा को, एसिंक्रोनस लिसनर को डेटाबेस रेफ़रंस से जोड़कर वापस पाया जाता है. डेटा की शुरुआती स्थिति के लिए लिसनर को एक बार ट्रिगर किया जाता है. इसके बाद, जब भी डेटा में बदलाव होता है, तब यह ट्रिगर होता है. इवेंट की पहचान करने वाले को कई अलग-अलग तरह के इवेंट मिल सकते हैं. डेटा वापस लाने का यह मोड, Java, Node.js, और Python एडमिन SDK में काम करता है.
- रीड ब्लॉक करना: Firebase रीयल टाइम डेटाबेस में सेव किया गया डेटा, डेटाबेस रेफ़रंस पर ब्लॉक करने का तरीका शुरू करके वापस पाया जाता है, जो पहचान फ़ाइल में सेव किया गया डेटा दिखाता है. हर तरीके से किया जाने वाला कॉल, एक बार किया जाने वाला ऑपरेशन होता है. इसका मतलब है कि SDK टूल, ऐसे किसी भी कॉलबैक को रजिस्टर नहीं करता जो बाद में डेटा अपडेट सुनता है. डेटा वापस लाने का यह मॉडल, Python और Go के एडमिन SDK टूल के साथ काम करता है.
शुरू करें
Firebase डेटाबेस से डेटा पढ़ने का तरीका समझने के लिए, पिछले लेख के ब्लॉगिंग उदाहरण पर दोबारा गौर करते हैं. याद रखें कि उदाहरण वाले ऐप्लिकेशन में मौजूद ब्लॉग पोस्ट, डेटाबेस के यूआरएल https://docs-examples.firebaseio.com/server/saving-data/fireblog/posts.json में सेव होती हैं. पोस्ट का डेटा पढ़ने के लिए, यह तरीका अपनाएं:
Java
public static class Post { public String author; public String title; public Post(String author, String title) { // ... } } // Get a reference to our posts final FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference ref = database.getReference("server/saving-data/fireblog/posts"); // Attach a listener to read the data at our posts reference ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { Post post = dataSnapshot.getValue(Post.class); System.out.println(post); } @Override public void onCancelled(DatabaseError databaseError) { System.out.println("The read failed: " + databaseError.getCode()); } });
Node.js के लिए
// Get a database reference to our posts const db = getDatabase(); const ref = db.ref('server/saving-data/fireblog/posts'); // Attach an asynchronous callback to read the data at our posts reference ref.on('value', (snapshot) => { console.log(snapshot.val()); }, (errorObject) => { console.log('The read failed: ' + errorObject.name); });
Python
# Import database module. from firebase_admin import db # Get a database reference to our posts ref = db.reference('server/saving-data/fireblog/posts') # Read the data at the posts reference (this is a blocking operation) print(ref.get())
शुरू करें
// Post is a json-serializable type. type Post struct { Author string `json:"author,omitempty"` Title string `json:"title,omitempty"` } // Create a database client from App. client, err := app.Database(ctx) if err != nil { log.Fatalln("Error initializing database client:", err) } // Get a database reference to our posts ref := client.NewRef("server/saving-data/fireblog/posts") // Read the data at the posts reference (this is a blocking operation) var post Post if err := ref.Get(ctx, &post); err != nil { log.Fatalln("Error reading value:", err) }
अगर आप ऊपर दिया गया कोड चलाते हैं, तो आपको कंसोल में लॉग की गई आपकी सभी पोस्ट वाला एक ऑब्जेक्ट दिखाई देगा. Node.js और Java के मामले में, आपके डेटाबेस के रेफ़रंस में जब भी नया डेटा जोड़ा जाता है, तब लिसनर फ़ंक्शन को कॉल किया जाता है. इसके लिए, आपको कोई और कोड लिखने की ज़रूरत नहीं है.
Java और Node.js में, कॉलबैक फ़ंक्शन को एक DataSnapshot
मिलता है, जो डेटा का स्नैपशॉट होता है. स्नैपशॉट किसी खास डेटाबेस रेफ़रंस के डेटा की तस्वीर होती है, जो किसी एक समय पर मौजूद होती है. किसी स्नैपशॉट पर val()
/ getValue()
को कॉल करने से, अलग-अलग भाषाओं के हिसाब से डेटा दिखता है. अगर पहचान फ़ाइल की जगह पर कोई डेटा मौजूद नहीं है, तो स्नैपशॉट की वैल्यू null
होगी. Python में get()
वाला तरीका, सीधे तौर पर डेटा को Python में दिखाता है. Go में Get()
फ़ंक्शन, डेटा को दिए गए डेटा स्ट्रक्चर में बदल देता है.
ध्यान दें कि हमने ऊपर दिए गए उदाहरण में, value
इवेंट टाइप का इस्तेमाल किया है. यह Firebase डेटाबेस के रेफ़रंस का पूरा कॉन्टेंट पढ़ता है, भले ही डेटा का सिर्फ़ एक हिस्सा बदला हो. value
, नीचे दिए गए पांच अलग-अलग तरह के इवेंट में से एक है. इसका इस्तेमाल, डेटाबेस से डेटा पढ़ने के लिए किया जा सकता है.
Java और Node.js में इवेंट टाइप पढ़ें
वैल्यू
value
इवेंट का इस्तेमाल, किसी दिए गए डेटाबेस पाथ में कॉन्टेंट के स्टैटिक स्नैपशॉट को पढ़ने के लिए किया जाता है, जैसा कि रीड इवेंट के समय मौजूद था. यह ट्रिगर, शुरुआती डेटा के साथ एक बार और हर बार डेटा में बदलाव होने पर ट्रिगर होता है. इवेंट कॉलबैक को एक स्नैपशॉट पास किया जाता है, जिसमें उस जगह का पूरा डेटा होता है. इसमें चाइल्ड डेटा भी शामिल होता है. ऊपर दिए गए कोड उदाहरण में, value
ने आपके ऐप्लिकेशन की सभी ब्लॉग पोस्ट दिखाई हैं. हर बार कोई नई ब्लॉग पोस्ट जोड़ने पर, कॉलबैक फ़ंक्शन सभी पोस्ट दिखाएगा.
चाइल्ड जोड़ा गया
आम तौर पर, child_added
इवेंट का इस्तेमाल, डेटाबेस से आइटम की सूची लेते समय किया जाता है. जगह का पूरा कॉन्टेंट दिखाने वाले value
के उलट, हर मौजूदा चाइल्ड खाते के लिए child_added
एक बार ट्रिगर होता है. इसके बाद, जब भी कोई नया बच्चा जोड़ा जाता है, तब बताए गए पाथ में वह हर बार ट्रिगर होता है. इवेंट कॉलबैक को एक स्नैपशॉट पास किया जाता है, जिसमें नए बच्चे का डेटा होता है. ऑर्डर करने के लिए, पिछले बच्चे की कुंजी वाला दूसरा तर्क भी पास किया जाता है.
अगर आपको अपने ब्लॉगिंग ऐप्लिकेशन में जोड़ी गई हर नई पोस्ट का डेटा ही वापस पाना है, तो child_added
का इस्तेमाल करें:
Java
ref.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) { Post newPost = dataSnapshot.getValue(Post.class); System.out.println("Author: " + newPost.author); System.out.println("Title: " + newPost.title); System.out.println("Previous Post ID: " + prevChildKey); } @Override public void onChildChanged(DataSnapshot dataSnapshot, String prevChildKey) {} @Override public void onChildRemoved(DataSnapshot dataSnapshot) {} @Override public void onChildMoved(DataSnapshot dataSnapshot, String prevChildKey) {} @Override public void onCancelled(DatabaseError databaseError) {} });
Node.js के लिए
// Retrieve new posts as they are added to our database ref.on('child_added', (snapshot, prevChildKey) => { const newPost = snapshot.val(); console.log('Author: ' + newPost.author); console.log('Title: ' + newPost.title); console.log('Previous Post ID: ' + prevChildKey); });
इस उदाहरण में स्नैपशॉट में, एक ब्लॉग पोस्ट के साथ एक ऑब्जेक्ट होगा. SDK टूल, वैल्यू की जानकारी हासिल करके पोस्ट को ऑब्जेक्ट में बदल देता है. इसलिए, author
और title
को कॉल करके, पोस्ट के लेखक और टाइटल की प्रॉपर्टी को ऐक्सेस किया जा सकता है. आपके पास दूसरे prevChildKey
आर्ग्युमेंट के पिछले पोस्ट आईडी का भी ऐक्सेस है.
बच्चे का खाता बदल दिया गया है
जब भी चाइल्ड नोड में बदलाव होता है, तो child_changed
इवेंट ट्रिगर हो जाता है. इसमें चाइल्ड नोड के
डिसेंडेंट में किए गए सभी बदलाव शामिल हैं. आम तौर पर, इसका इस्तेमाल child_added
और child_removed
के साथ किया जाता है, ताकि आइटम की सूची में हुए बदलावों का जवाब दिया जा सके. इवेंट कॉलबैक को भेजे गए स्नैपशॉट में, बच्चे का अपडेट किया गया डेटा होता है.
ब्लॉग पोस्ट में बदलाव किए जाने के बाद, उनका अपडेट किया गया डेटा पढ़ने के लिए, child_changed
का इस्तेमाल किया जा सकता है:
Java
ref.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {} @Override public void onChildChanged(DataSnapshot dataSnapshot, String prevChildKey) { Post changedPost = dataSnapshot.getValue(Post.class); System.out.println("The updated post title is: " + changedPost.title); } @Override public void onChildRemoved(DataSnapshot dataSnapshot) {} @Override public void onChildMoved(DataSnapshot dataSnapshot, String prevChildKey) {} @Override public void onCancelled(DatabaseError databaseError) {} });
Node.js के लिए
// Get the data on a post that has changed ref.on('child_changed', (snapshot) => { const changedPost = snapshot.val(); console.log('The updated post title is ' + changedPost.title); });
बच्चे को हटाया गया
child_removed
इवेंट तब ट्रिगर होता है, जब किसी बच्चे को तुरंत हटाया जाता है. आम तौर पर, इसे child_added
और child_changed
के साथ इस्तेमाल किया जाता है. इवेंट कॉलबैक को पास किए गए स्नैपशॉट में, हटाए गए चाइल्ड खाते का डेटा होता है.
ब्लॉग के उदाहरण में, मिटाई गई पोस्ट के बारे में सूचना को कंसोल में लॉग करने के लिए, child_removed
का इस्तेमाल किया जा सकता है:
Java
ref.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {} @Override public void onChildChanged(DataSnapshot dataSnapshot, String prevChildKey) {} @Override public void onChildRemoved(DataSnapshot dataSnapshot) { Post removedPost = dataSnapshot.getValue(Post.class); System.out.println("The blog post titled " + removedPost.title + " has been deleted"); } @Override public void onChildMoved(DataSnapshot dataSnapshot, String prevChildKey) {} @Override public void onCancelled(DatabaseError databaseError) {} });
Node.js के लिए
// Get a reference to our posts const ref = db.ref('server/saving-data/fireblog/posts'); // Get the data on a post that has been removed ref.on('child_removed', (snapshot) => { const deletedPost = snapshot.val(); console.log('The blog post titled \'' + deletedPost.title + '\' has been deleted'); });
बच्चे का स्थान बदल गया
child_moved
इवेंट का इस्तेमाल, ऑर्डर किए गए डेटा के साथ काम करते समय किया जाता है. इसके बारे में जानकारी अगले सेक्शन में दी गई है.
इवेंट की गारंटी
Firebase डेटाबेस, इवेंट से जुड़ी कई अहम गारंटी देता है:
डेटाबेस इवेंट की गारंटी |
---|
स्थानीय स्थिति बदलने पर इवेंट हमेशा ट्रिगर होंगे. |
इवेंट हमेशा डेटा की सही स्थिति दिखाएंगे, भले ही स्थानीय कार्रवाइयों या समय की वजह से थोड़े समय के लिए अंतर हो, जैसे कि कुछ समय के लिए इंटरनेट का बंद होना. |
एक क्लाइंट की टिप्पणियों को हमेशा सर्वर पर लिखा जाएगा और ऑर्डर के हिसाब से अन्य उपयोगकर्ताओं को ब्रॉडकास्ट किया जाएगा. |
वैल्यू इवेंट हमेशा आखिरी में ट्रिगर होते हैं. साथ ही, उनके लिए इस बात की गारंटी दी जाती है कि स्नैपशॉट लेने से पहले हुए किसी भी दूसरे इवेंट के अपडेट शामिल किए जा सकते हैं. |
वैल्यू इवेंट हमेशा आखिर में ट्रिगर होते हैं, इसलिए नीचे दिया गया उदाहरण हमेशा काम करेगा:
Java
final AtomicInteger count = new AtomicInteger(); ref.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) { // New child added, increment count int newCount = count.incrementAndGet(); System.out.println("Added " + dataSnapshot.getKey() + ", count is " + newCount); } // ... }); // The number of children will always be equal to 'count' since the value of // the dataSnapshot here will include every child_added event triggered before this point. ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { long numChildren = dataSnapshot.getChildrenCount(); System.out.println(count.get() + " == " + numChildren); } @Override public void onCancelled(DatabaseError databaseError) {} });
Node.js के लिए
let count = 0; ref.on('child_added', (snap) => { count++; console.log('added:', snap.key); }); // length will always equal count, since snap.val() will include every child_added event // triggered before this point ref.once('value', (snap) => { console.log('initial data loaded!', snap.numChildren() === count); });
कॉलबैक अलग करना
इवेंट टाइप और कॉलबैक फ़ंक्शन को तय करके कॉलबैक हटा दिए जाते हैं, जैसे:
Java
// Create and attach listener ValueEventListener listener = new ValueEventListener() { // ... }; ref.addValueEventListener(listener); // Remove listener ref.removeEventListener(listener);
Node.js के लिए
ref.off('value', originalCallback);
अगर आपने on()
में कोई स्कोप कॉन्टेक्स्ट पास किया है, तो कॉलबैक को अलग करते समय, इसे पास किया जाना चाहिए:
Java
// Not applicable for Java
Node.js के लिए
ref.off('value', originalCallback, ctx);
अगर आपको किसी जगह से सभी कॉलबैक हटाने हैं, तो यह तरीका अपनाएं:
Java
// No Java equivalent, listeners must be removed individually.
Node.js के लिए
// Remove all value callbacks ref.off('value'); // Remove all callbacks of any type ref.off();
डेटा को एक बार पढ़ा जा रहा है
कुछ मामलों में, कॉलबैक को एक बार कॉल करना और उसे तुरंत हटा देना सही रहता है. इस प्रक्रिया को आसान बनाने के लिए, हमने एक हेल्पर फ़ंक्शन बनाया है:
Java
ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // ... } @Override public void onCancelled(DatabaseError databaseError) { // ... } });
Node.js के लिए
ref.once('value', (data) => { // do some stuff once });
Python
# Import database module. from firebase_admin import db # Get a database reference to our posts ref = db.reference('server/saving-data/fireblog/posts') # Read the data at the posts reference (this is a blocking operation) print(ref.get())
शुरू करें
// Create a database client from App. client, err := app.Database(ctx) if err != nil { log.Fatalln("Error initializing database client:", err) } // Get a database reference to our posts ref := client.NewRef("server/saving-data/fireblog/posts") // Read the data at the posts reference (this is a blocking operation) var post Post if err := ref.Get(ctx, &post); err != nil { log.Fatalln("Error reading value:", err) }
डेटा क्वेरी करना
Firebase डेटाबेस क्वेरी की मदद से, अलग-अलग फ़ैक्टर के आधार पर चुनिंदा डेटा को वापस लाया जा सकता है. अपने डेटाबेस में क्वेरी बनाने के लिए, सबसे पहले यह बताएं कि आपको डेटा को क्रम से लगाने के लिए, इनमें से किसी एक फ़ंक्शन का इस्तेमाल करना होगा: orderByChild()
, orderByKey()
या orderByValue()
. इसके बाद, मुश्किल क्वेरी करने के लिए इन्हें पांच अन्य तरीकों के साथ जोड़ा जा सकता है: limitToFirst()
,
limitToLast()
, startAt()
, endAt()
, और equalTo()
.
Firebase में हम सभी को लगता है कि डायनासोर बहुत अच्छे होते हैं. इसलिए, हम यह दिखाने के लिए कि आप अपने Firebase डेटाबेस में डेटा के लिए क्वेरी कैसे कर सकते हैं, डायनासोर के तथ्यों के सैंपल डेटाबेस से एक स्निपेट का इस्तेमाल करेंगे.:
{ "lambeosaurus": { "height" : 2.1, "length" : 12.5, "weight": 5000 }, "stegosaurus": { "height" : 4, "length" : 9, "weight" : 2500 } }
डेटा को तीन तरीकों से क्रम में लगाया जा सकता है: चाइल्ड की, कुंजी से या वैल्यू से. बेसिक डेटाबेस क्वेरी, इनमें से किसी एक ऑर्डर करने वाले फ़ंक्शन से शुरू होती है. हर फ़ंक्शन के बारे में नीचे बताया गया है.
बताई गई चाइल्ड कुंजी के हिसाब से क्रम में लगाना
किसी कॉमन चाइल्ड कुंजी के ज़रिए नोड को क्रम में लगाया जा सकता है. इसके लिए, उस कुंजी को orderByChild()
के पास भेजा जा सकता है. उदाहरण के लिए, सभी डायनासोर को लंबाई के हिसाब से पढ़ने के लिए, ये काम किए जा सकते हैं:
Java
public static class Dinosaur { public int height; public int weight; public Dinosaur(int height, int weight) { // ... } } final DatabaseReference dinosaursRef = database.getReference("dinosaurs"); dinosaursRef.orderByChild("height").addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) { Dinosaur dinosaur = dataSnapshot.getValue(Dinosaur.class); System.out.println(dataSnapshot.getKey() + " was " + dinosaur.height + " meters tall."); } // ... });
Node.js के लिए
const ref = db.ref('dinosaurs'); ref.orderByChild('height').on('child_added', (snapshot) => { console.log(snapshot.key + ' was ' + snapshot.val().height + ' meters tall'); });
Python
ref = db.reference('dinosaurs') snapshot = ref.order_by_child('height').get() for key, val in snapshot.items(): print('{0} was {1} meters tall'.format(key, val))
शुरू करें
// Dinosaur is a json-serializable type. type Dinosaur struct { Height int `json:"height"` Width int `json:"width"` } ref := client.NewRef("dinosaurs") results, err := ref.OrderByChild("height").GetOrdered(ctx) if err != nil { log.Fatalln("Error querying database:", err) } for _, r := range results { var d Dinosaur if err := r.Unmarshal(&d); err != nil { log.Fatalln("Error unmarshaling result:", err) } fmt.Printf("%s was %d meteres tall", r.Key(), d.Height) }
जिस नोड में वह चाइल्ड कुंजी नहीं होती है जिसके लिए हम क्वेरी कर रहे हैं, उसे null
की वैल्यू के साथ क्रम में लगाया जाता है. इसका मतलब है कि यह क्रम में पहले आएगा. डेटा को ऑर्डर करने का तरीका जानने के लिए, डेटा को क्रम से लगाने का तरीका सेक्शन देखें.
क्वेरी को पूरी तरह से नेस्ट किए गए बच्चों के हिसाब से क्रम में लगाया जा सकता है, न कि सिर्फ़ बच्चों के लिए एक लेवल नीचे. यह तब फ़ायदेमंद होता है, जब आपने इस तरह के डेटा को पूरी तरह से नेस्ट किया हुआ है:
{ "lambeosaurus": { "dimensions": { "height" : 2.1, "length" : 12.5, "weight": 5000 } }, "stegosaurus": { "dimensions": { "height" : 4, "length" : 9, "weight" : 2500 } } }
अब ऊंचाई की क्वेरी करने के लिए, किसी एक कुंजी के बजाय ऑब्जेक्ट के पूरे पाथ का इस्तेमाल किया जा सकता है:
Java
dinosaursRef.orderByChild("dimensions/height").addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) { // ... } // ... });
Node.js के लिए
const ref = db.ref('dinosaurs'); ref.orderByChild('dimensions/height').on('child_added', (snapshot) => { console.log(snapshot.key + ' was ' + snapshot.val().height + ' meters tall'); });
Python
ref = db.reference('dinosaurs') snapshot = ref.order_by_child('dimensions/height').get() for key, val in snapshot.items(): print('{0} was {1} meters tall'.format(key, val))
शुरू करें
ref := client.NewRef("dinosaurs") results, err := ref.OrderByChild("dimensions/height").GetOrdered(ctx) if err != nil { log.Fatalln("Error querying database:", err) } for _, r := range results { var d Dinosaur if err := r.Unmarshal(&d); err != nil { log.Fatalln("Error unmarshaling result:", err) } fmt.Printf("%s was %d meteres tall", r.Key(), d.Height) }
क्वेरी को एक बार में सिर्फ़ एक कुंजी के हिसाब से क्रम में लगाया जा सकता है. एक ही क्वेरी
पर orderByChild()
को कई बार कॉल करने से, गड़बड़ी का मैसेज दिखता है.
कुंजी के अनुसार क्रम से लगाना
orderByKey()
तरीके का इस्तेमाल करके, नोड को उनकी कुंजियों के हिसाब से भी क्रम में लगाया जा सकता है. नीचे दिए गए उदाहरण में सभी डायनासोर को वर्णमाला के क्रम में पढ़ा गया है:
Java
dinosaursRef.orderByKey().addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) { System.out.println(dataSnapshot.getKey()); } // ... });
Node.js के लिए
var ref = db.ref('dinosaurs'); ref.orderByKey().on('child_added', (snapshot) => { console.log(snapshot.key); });
Python
ref = db.reference('dinosaurs') snapshot = ref.order_by_key().get() print(snapshot)
शुरू करें
ref := client.NewRef("dinosaurs") results, err := ref.OrderByKey().GetOrdered(ctx) if err != nil { log.Fatalln("Error querying database:", err) } snapshot := make([]Dinosaur, len(results)) for i, r := range results { var d Dinosaur if err := r.Unmarshal(&d); err != nil { log.Fatalln("Error unmarshaling result:", err) } snapshot[i] = d } fmt.Println(snapshot)
वैल्यू के हिसाब से क्रम में लगाएं
आप orderByValue()
तरीके का इस्तेमाल करके, उनकी चाइल्ड कुंजियों की वैल्यू के हिसाब से नोड को ऑर्डर कर सकते हैं. मान लें कि डायनासॉर, डायनो खेल प्रतियोगिता में हिस्सा ले रहे हैं और आप नीचे दिए गए फ़ॉर्मैट में उनके स्कोर पर नज़र रख रहे हैं:
{ "scores": { "bruhathkayosaurus" : 55, "lambeosaurus" : 21, "linhenykus" : 80, "pterodactyl" : 93, "stegosaurus" : 5, "triceratops" : 22 } }
डायनासोर को उनके स्कोर के अनुसार क्रम से लगाने के लिए, आप यह क्वेरी तैयार कर सकते हैं:
Java
DatabaseReference scoresRef = database.getReference("scores"); scoresRef.orderByValue().addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) { System.out.println("The " + dataSnapshot.getKey() + " score is " + dataSnapshot.getValue()); } // ... });
Node.js के लिए
const scoresRef = db.ref('scores'); scoresRef.orderByValue().on('value', (snapshot) => { snapshot.forEach((data) => { console.log('The ' + data.key + ' dinosaur\'s score is ' + data.val()); }); });
Python
ref = db.reference('scores') snapshot = ref.order_by_value().get() for key, val in snapshot.items(): print('The {0} dinosaur\'s score is {1}'.format(key, val))
शुरू करें
ref := client.NewRef("scores") results, err := ref.OrderByValue().GetOrdered(ctx) if err != nil { log.Fatalln("Error querying database:", err) } for _, r := range results { var score int if err := r.Unmarshal(&score); err != nil { log.Fatalln("Error unmarshaling result:", err) } fmt.Printf("The %s dinosaur's score is %d\n", r.Key(), score) }
orderByValue()
का इस्तेमाल करते समय null
, बूलियन, स्ट्रिंग, और ऑब्जेक्ट वैल्यू को कैसे क्रम में लगाया जाता है, इस बारे में ज़्यादा जानने के लिए, डेटा को क्रम से लगाने का तरीका सेक्शन देखें.
जटिल क्वेरी
अब यह साफ़ है कि आपके डेटा को किस क्रम में रखा जाता है, तो ज़्यादा जटिल क्वेरी बनाने के लिए, नीचे बताए गए limit या range तरीकों का इस्तेमाल करें.
क्वेरी सीमित करें
limitToFirst()
और limitToLast()
क्वेरी का इस्तेमाल यह तय करने के लिए किया जाता है कि किसी कॉलबैक
के लिए, ज़्यादा से ज़्यादा कितने बच्चों को सिंक किया जाए. अगर आपने 100 इवेंट की सीमा सेट की है, तो शुरुआत में आपको सिर्फ़ 100 child_added
इवेंट ही मिलेंगे. अगर आपके डेटाबेस में
100 से कम मैसेज सेव हैं, तो हर मैसेज के लिए
एक child_added
इवेंट फ़ायर होगा. हालांकि, अगर आपके पास 100 से ज़्यादा मैसेज हैं, तो आपको उनमें से 100 मैसेज के लिए ही child_added
इवेंट मिलेगा. अगर limitToFirst()
का इस्तेमाल किया जा रहा है, तो ये पहले 100 क्रम वाले मैसेज हैं या अगर limitToLast()
का इस्तेमाल किया जा रहा है, तो क्रम वाले आखिरी 100 मैसेज. आइटम में बदलाव होने पर, आपको क्वेरी डालने वाले आइटम के लिए child_added
इवेंट और उसे छोड़ने वाले आइटम के लिए child_removed
इवेंट मिलेंगे, ताकि
कुल संख्या 100 पर बनी रहे.
डायनासॉर से जुड़े तथ्यों के डेटाबेस और orderByChild()
की मदद से, दो सबसे भारी डायनासॉर
का पता लगाया जा सकता है:
Java
dinosaursRef.orderByChild("weight").limitToLast(2).addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) { System.out.println(dataSnapshot.getKey()); } // ... });
Node.js के लिए
const ref = db.ref('dinosaurs'); ref.orderByChild('weight').limitToLast(2).on('child_added', (snapshot) => { console.log(snapshot.key); });
Python
ref = db.reference('dinosaurs') snapshot = ref.order_by_child('weight').limit_to_last(2).get() for key in snapshot: print(key)
शुरू करें
ref := client.NewRef("dinosaurs") results, err := ref.OrderByChild("weight").LimitToLast(2).GetOrdered(ctx) if err != nil { log.Fatalln("Error querying database:", err) } for _, r := range results { fmt.Println(r.Key()) }
child_added
कॉलबैक सिर्फ़ दो बार ट्रिगर होता है, बशर्ते डेटाबेस में
दो से कम डायनासॉर सेव न हों. डेटाबेस में जोड़े जाने वाले हर नए और भारी डायनासोर के लिए भी इसे हटाया जाता है.
Python में, क्वेरी सीधे तौर पर ऐसा OrderedDict
दिखाती है जिसमें दो सबसे भारी डायनासोर होते हैं.
इसी तरह, limitToFirst()
का इस्तेमाल करके, दो सबसे छोटे डायनासोर ढूंढे जा सकते हैं:
Java
dinosaursRef.orderByChild("weight").limitToFirst(2).addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) { System.out.println(dataSnapshot.getKey()); } // ... });
Node.js के लिए
const ref = db.ref('dinosaurs'); ref.orderByChild('height').limitToFirst(2).on('child_added', (snapshot) => { console.log(snapshot.key); });
Python
ref = db.reference('dinosaurs') snapshot = ref.order_by_child('height').limit_to_first(2).get() for key in snapshot: print(key)
शुरू करें
ref := client.NewRef("dinosaurs") results, err := ref.OrderByChild("height").LimitToFirst(2).GetOrdered(ctx) if err != nil { log.Fatalln("Error querying database:", err) } for _, r := range results { fmt.Println(r.Key()) }
child_added
कॉलबैक सिर्फ़ दो बार ट्रिगर होता है, जब तक कि डेटाबेस में दो से कम डायनासॉर सेव न हों. अगर पहले दो डायनासोर में से एक को डेटाबेस से हटाया जाता है, तो भी यह फिर से शुरू हो जाएगा, क्योंकि नया डायनासॉर अब दूसरा सबसे छोटा हो जाएगा. Python में, क्वेरी सीधे तौर पर ऐसा OrderedDict
दिखाती है जिसमें सबसे छोटे डायनासोर होते हैं.
orderByValue()
के साथ, सीमित क्वेरी के लिए भी जवाब दिया जा सकता है. अगर आपको सबसे ज़्यादा स्कोर वाले तीन सबसे ज़्यादा स्कोर वाले डायनो स्पोर्ट्स के डायनासॉर वाला लीडरबोर्ड बनाना है, तो ऐसा किया जा सकता है:
Java
scoresRef.orderByValue().limitToFirst(3).addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) { System.out.println("The " + dataSnapshot.getKey() + " score is " + dataSnapshot.getValue()); } // ... });
Node.js के लिए
const scoresRef = db.ref('scores'); scoresRef.orderByValue().limitToLast(3).on('value', (snapshot) =>{ snapshot.forEach((data) => { console.log('The ' + data.key + ' dinosaur\'s score is ' + data.val()); }); });
Python
scores_ref = db.reference('scores') snapshot = scores_ref.order_by_value().limit_to_last(3).get() for key, val in snapshot.items(): print('The {0} dinosaur\'s score is {1}'.format(key, val))
शुरू करें
ref := client.NewRef("scores") results, err := ref.OrderByValue().LimitToLast(3).GetOrdered(ctx) if err != nil { log.Fatalln("Error querying database:", err) } for _, r := range results { var score int if err := r.Unmarshal(&score); err != nil { log.Fatalln("Error unmarshaling result:", err) } fmt.Printf("The %s dinosaur's score is %d\n", r.Key(), score) }
रेंज क्वेरी
startAt()
, endAt()
, और equalTo()
का इस्तेमाल करके, अपनी क्वेरी के लिए मनमुताबिक शुरू और खत्म होने के पॉइंट चुने जा सकते हैं. उदाहरण के लिए, अगर आपको
कम से कम तीन मीटर ऊंचे सभी डायनासोर ढूंढने हैं, तो orderByChild()
और startAt()
को एक साथ जोड़ा जा सकता है:
Java
dinosaursRef.orderByChild("height").startAt(3).addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) { System.out.println(dataSnapshot.getKey()); } // ... });
Node.js के लिए
const ref = db.ref('dinosaurs'); ref.orderByChild('height').startAt(3).on('child_added', (snapshot) => { console.log(snapshot.key); });
Python
ref = db.reference('dinosaurs') snapshot = ref.order_by_child('height').start_at(3).get() for key in snapshot: print(key)
शुरू करें
ref := client.NewRef("dinosaurs") results, err := ref.OrderByChild("height").StartAt(3).GetOrdered(ctx) if err != nil { log.Fatalln("Error querying database:", err) } for _, r := range results { fmt.Println(r.Key()) }
endAt()
का इस्तेमाल करके, उन सभी डायनासोर को खोजा जा सकता है जिनके नाम टेरोडैक्टिल से पहले, शब्दकोश के रूप में दिए गए थे:
Java
dinosaursRef.orderByKey().endAt("pterodactyl").addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) { System.out.println(dataSnapshot.getKey()); } // ... });
Node.js के लिए
const ref = db.ref('dinosaurs'); ref.orderByKey().endAt('pterodactyl').on('child_added', (snapshot) => { console.log(snapshot.key); });
Python
ref = db.reference('dinosaurs') snapshot = ref.order_by_key().end_at('pterodactyl').get() for key in snapshot: print(key)
शुरू करें
ref := client.NewRef("dinosaurs") results, err := ref.OrderByKey().EndAt("pterodactyl").GetOrdered(ctx) if err != nil { log.Fatalln("Error querying database:", err) } for _, r := range results { fmt.Println(r.Key()) }
क्वेरी के दोनों सिरों को सीमित करने के लिए, startAt()
और endAt()
को जोड़ा जा सकता है. नीचे दिए गए उदाहरण में उन सभी डायनासोर को शामिल किया गया है जिनका नाम "b" अक्षर से शुरू होता है:
Java
dinosaursRef.orderByKey().startAt("b").endAt("b\uf8ff").addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) { System.out.println(dataSnapshot.getKey()); } // ... });
Node.js के लिए
var ref = db.ref('dinosaurs'); ref.orderByKey().startAt('b').endAt('b\uf8ff').on('child_added', (snapshot) => { console.log(snapshot.key); });
Python
ref = db.reference('dinosaurs') snapshot = ref.order_by_key().start_at('b').end_at(u'b\uf8ff').get() for key in snapshot: print(key)
शुरू करें
ref := client.NewRef("dinosaurs") results, err := ref.OrderByKey().StartAt("b").EndAt("b\uf8ff").GetOrdered(ctx) if err != nil { log.Fatalln("Error querying database:", err) } for _, r := range results { fmt.Println(r.Key()) }
equalTo()
वाले तरीके की मदद से, एग्ज़ैक्ट मैच के हिसाब से डेटा को फ़िल्टर किया जा सकता है. अन्य रेंज की क्वेरी की तरह ही, क्वेरी भी मेल खाने वाले हर चाइल्ड नोड के लिए फ़ायर होगी. उदाहरण के लिए, नीचे दी गई क्वेरी का इस्तेमाल करके,
25 मीटर की ऊंचाई वाले सभी डायनासोर को खोजा जा सकता है:
Java
dinosaursRef.orderByChild("height").equalTo(25).addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) { System.out.println(dataSnapshot.getKey()); } // ... });
Node.js के लिए
const ref = db.ref('dinosaurs'); ref.orderByChild('height').equalTo(25).on('child_added', (snapshot) => { console.log(snapshot.key); });
Python
ref = db.reference('dinosaurs') snapshot = ref.order_by_child('height').equal_to(25).get() for key in snapshot: print(key)
शुरू करें
ref := client.NewRef("dinosaurs") results, err := ref.OrderByChild("height").EqualTo(25).GetOrdered(ctx) if err != nil { log.Fatalln("Error querying database:", err) } for _, r := range results { fmt.Println(r.Key()) }
रेंज क्वेरी तब भी काम आती हैं, जब आपको अपने डेटा को कई पेजों में बांटना होता है.
जानकारी को एक जगह इकट्ठा किया जा रहा है
मुश्किल क्वेरी बनाने के लिए, इन सभी तकनीकों को एक साथ जोड़ा जा सकता है. उदाहरण के लिए, आपको उस डायनासोर का नाम मिल सकता है जो स्टेगोसॉरस से बस छोटा है:
Java
dinosaursRef.child("stegosaurus").child("height").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot stegoHeightSnapshot) { Integer favoriteDinoHeight = stegoHeightSnapshot.getValue(Integer.class); Query query = dinosaursRef.orderByChild("height").endAt(favoriteDinoHeight).limitToLast(2); query.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // Data is ordered by increasing height, so we want the first entry DataSnapshot firstChild = dataSnapshot.getChildren().iterator().next(); System.out.println("The dinosaur just shorter than the stegosaurus is: " + firstChild.getKey()); } @Override public void onCancelled(DatabaseError databaseError) { // ... } }); } @Override public void onCancelled(DatabaseError databaseError) { // ... } });
Node.js के लिए
const ref = db.ref('dinosaurs'); ref.child('stegosaurus').child('height').on('value', (stegosaurusHeightSnapshot) => { const favoriteDinoHeight = stegosaurusHeightSnapshot.val(); const queryRef = ref.orderByChild('height').endAt(favoriteDinoHeight).limitToLast(2); queryRef.on('value', (querySnapshot) => { if (querySnapshot.numChildren() === 2) { // Data is ordered by increasing height, so we want the first entry querySnapshot.forEach((dinoSnapshot) => { console.log('The dinosaur just shorter than the stegasaurus is ' + dinoSnapshot.key); // Returning true means that we will only loop through the forEach() one time return true; }); } else { console.log('The stegosaurus is the shortest dino'); } }); });
Python
ref = db.reference('dinosaurs') favotire_dino_height = ref.child('stegosaurus').child('height').get() query = ref.order_by_child('height').end_at(favotire_dino_height).limit_to_last(2) snapshot = query.get() if len(snapshot) == 2: # Data is ordered by increasing height, so we want the first entry. # Second entry is stegosarus. for key in snapshot: print('The dinosaur just shorter than the stegosaurus is {0}'.format(key)) return else: print('The stegosaurus is the shortest dino')
शुरू करें
ref := client.NewRef("dinosaurs") var favDinoHeight int if err := ref.Child("stegosaurus").Child("height").Get(ctx, &favDinoHeight); err != nil { log.Fatalln("Error querying database:", err) } query := ref.OrderByChild("height").EndAt(favDinoHeight).LimitToLast(2) results, err := query.GetOrdered(ctx) if err != nil { log.Fatalln("Error querying database:", err) } if len(results) == 2 { // Data is ordered by increasing height, so we want the first entry. // Second entry is stegosarus. fmt.Printf("The dinosaur just shorter than the stegosaurus is %s\n", results[0].Key()) } else { fmt.Println("The stegosaurus is the shortest dino") }
डेटा को ऑर्डर करने का तरीका
इस सेक्शन में बताया गया है कि ऑर्डर करने के चार तरीकों में से हर एक का इस्तेमाल करने पर, आपका डेटा किस क्रम में व्यवस्थित किया जाता है.
OrderByChild
orderByChild()
का इस्तेमाल करते समय, तय की गई चाइल्ड कुंजी वाले डेटा का क्रम इस तरह तय किया जाता है:
- जिन बच्चों के पास खास चाइल्ड कुंजी के लिए,
null
वैल्यू है वे पहले आते हैं. - आगे बताए गए चाइल्ड बटन के लिए,
false
वैल्यू वाले बच्चे आगे आते हैं. अगर एक से ज़्यादा बच्चों की वैल्यूfalse
है, तो उन्हें कुंजी के हिसाब से लेक्सिकोग्राफ़िक तरीके से क्रम में लगाया जाता है. - आगे बताए गए चाइल्ड बटन के लिए,
true
वैल्यू वाले बच्चे आगे आते हैं. अगर एक से ज़्यादा बच्चों की वैल्यूtrue
है, तो उन्हें कुंजी के हिसाब से लेक्सोग्राफ़िक तरीके से क्रम में लगाया जाता है. - जिन बच्चों के पास संख्या वाली वैल्यू है वे आगे आते हैं. इन बच्चों को बढ़ते क्रम में लगाया जाता है. अगर किसी चाइल्ड नोड के लिए एक से ज़्यादा चाइल्ड नोड वाली वैल्यू एक जैसी है, तो उन्हें कुंजी के हिसाब से क्रम में लगाया जाता है.
- स्ट्रिंग, संख्याओं के बाद आती हैं और उन्हें बढ़ते क्रम में लेक्सिकोलॉजिकल तरीके से क्रम में लगाया जाता है. अगर बताए गए चाइल्ड नोड के लिए एक से ज़्यादा बच्चों का एक ही मान है, तो उन्हें कुंजी के हिसाब से लेक्सिकोलॉजिकल तरीके से क्रम में लगाया जाता है.
- ऑब्जेक्ट आखिरी में आते हैं. साथ ही, उन्हें कुंजी के हिसाब से बढ़ते क्रम में क्रम से लगाया जाता है.
OrderByKey
अपने डेटा को क्रम से लगाने के लिए orderByKey()
का इस्तेमाल करने पर, डेटा को कुंजी के हिसाब से बढ़ते क्रम में इस तरह दिखाया जाता है. ध्यान रखें कि कुंजियां सिर्फ़ स्ट्रिंग हो सकती हैं.
- जिन बच्चों के पास ऐसी कुंजी है जिसे 32-बिट पूर्णांक के तौर पर पार्स किया जा सकता है वे पहले आते हैं. इन बच्चों को बढ़ते क्रम में लगाया जाता है.
- जिन बच्चों की कुंजी कुंजी के तौर पर होती है वे आगे आते हैं. इन बच्चों को ऊपर की ओर बढ़ते क्रम में लेक्सिकोलॉजिकल तरीके से, क्रम से लगाया जाता है.
OrderByValue
orderByValue()
का इस्तेमाल करने पर, बच्चों को उनकी वैल्यू के हिसाब से क्रम में लगाया जाता है. क्रम से लगाने की शर्तें orderByChild()
के जैसी ही होती हैं. हालांकि, किसी चाइल्ड कुंजी की वैल्यू के बजाय, नोड की वैल्यू का इस्तेमाल किया जाता है.