firebase - फायरस्टार क्वेरी सबकोलेक्शन




google-cloud-firestore (6)

मुझे लगा कि मैं पढ़ता हूं कि आप नए फायरबेस फायरस्टार के साथ सबकोलेक्शन को क्वेरी कर सकते हैं, लेकिन मुझे कोई उदाहरण नहीं दिखता। उदाहरण के लिए मेरे पास मेरा फायरस्टार सेटअप निम्नलिखित तरीके से है:

  • नृत्य [संग्रह]
    • danceName
    • गाने [संग्रह]
      • गाने का नाम

मैं क्वेरी कैसे कर पाऊंगा "सभी नृत्यों का पता लगाएं जहां songName == 'X'"


क्वेरी की सीमाएँ

क्लाउड फायरस्टोर निम्नलिखित प्रकार के प्रश्नों का समर्थन नहीं करता है:

  1. विभिन्न क्षेत्रों पर रेंज फ़िल्टर के साथ क्वेरी।

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

  3. तार्किक या प्रश्न। इस स्थिति में, आपको प्रत्येक OR शर्त के लिए एक अलग क्वेरी बनानी चाहिए और अपने ऐप में क्वेरी परिणामों को मर्ज करना होगा।
  4. ख! = खंड के साथ प्रश्न। इस स्थिति में, आपको क्वेरी को अधिक-से-अधिक क्वेरी और कम-से-कम क्वेरी से विभाजित करना चाहिए। उदाहरण के लिए, हालांकि क्वेरी क्लॉज जहां ("आयु", "! =", "30") समर्थित नहीं है, आप दो क्वेरी को मिलाकर एक ही परिणाम प्राप्त कर सकते हैं, एक जहां क्लॉज़ है ("आयु", "< "," 30 ") और एक खंड के साथ जहां (" आयु ","> ", 30)।

आप हमेशा इस तरह की खोज कर सकते हैं: -

this.key$ = new BehaviorSubject(null);

return this.key$.switchMap(key =>
  this.angFirestore
    .collection("dances").doc("danceName").collections("songs", ref =>
      ref
        .where("songName", "==", X)
    )
    .snapshotChanges()
    .map(actions => {
      if (actions.toString()) {
        return actions.map(a => {
          const data = a.payload.doc.data() as Dance;
          const id = a.payload.doc.id;
          return { id, ...data };
        });
      } else {
        return false;
      }
    })
);

यदि आप संग्रह के रूप में एक वस्तु के रूप में गाने संग्रहित करते हैं तो क्या होगा? प्रत्येक नृत्य एक क्षेत्र के रूप में गाने के साथ: ऑब्जेक्ट टाइप करें (संग्रह नहीं)

{
  danceName: "My Dance",
  songs: {
    "aNameOfASong": true,
    "aNameOfAnotherSong": true,
  }
}

तब आप सभी नामों के लिए क्वेरी कर सकते हैं

db.collection('Dances')
  .where('songs.aNameOfASong', '==', true)
  .get()
  .then(function(querySnapshot) {
    querySnapshot.forEach(function(doc) {
      console.log(doc.id, " => ", doc.data());
    });
   })
   .catch(function(error) {
     console.log("Error getting documents: ", error);
    });

अद्यतन अब फायरस्टार सरणी-समाहित करता है

इन दस्तावेजों को रखने के बाद

    {danceName: 'Danca name 1', songName: ['Title1','Title2']}
    {danceName: 'Danca name 2', songName: ['Title3']}

इस तरह से करो

collection("Dances")
    .where("songName", "array-contains", "Title1")
    .get()...

@ Nelson.b.austin चूंकि फायरस्टार के पास अभी तक ऐसा नहीं है, मेरा सुझाव है कि आप एक फ्लैट संरचना है, जिसका अर्थ है:

Dances = {
    danceName: 'Dance name 1',
    songName_Title1: true,
    songName_Title2: true,
    songName_Title3: false
}

इस तरह से होने पर, आप इसे पूरा कर सकते हैं:

var songTitle = 'Title1';
var dances = db.collection("Dances");
var query = dances.where("songName_"+songTitle, "==", true);

आशा है कि ये आपकी मदद करेगा।


अपडेट 2019-05-07

आज हमने संग्रह समूह क्वेरीज़ जारी कीं , और ये आपको सबकोइलेक्शन में क्वेरी करने की अनुमति देते हैं।

इसलिए, उदाहरण के लिए वेब एसडीके में:

db.collectionGroup('Songs')
  .where('songName', '==', 'X')
  .get()

यह किसी भी संग्रह में दस्तावेजों से मेल खाता है जहां संग्रह पथ का अंतिम भाग 'गीत' है।

आपका मूल प्रश्न नाच को खोजने के बारे में था जहां गीतनाम == 'एक्स', और यह अभी भी सीधे संभव नहीं है, हालांकि, प्रत्येक गीत के लिए जो आपको मेल खाता है, आप उसके माता-पिता को लोड कर सकते हैं।

मूल उत्तर

यह एक ऐसी विशेषता है जो अभी तक मौजूद नहीं है। इसे एक "संग्रह समूह क्वेरी" कहा जाता है और आपको सभी गीतों की क्वेरी करने की अनुमति देगा चाहे कोई भी नृत्य उनमें निहित हो। यह ऐसी चीज है जिसका हम समर्थन करना चाहते हैं, लेकिन जब यह आ रही है तो इसका कोई ठोस समय नहीं है।

इस बिंदु पर वैकल्पिक संरचना गीतों को एक शीर्ष-स्तरीय संग्रह बनाने और बनाने के लिए है जो गीत को नृत्य करता है वह गीत की एक संपत्ति का एक हिस्सा है।


var songs = []    
db.collection('Dances')
      .where('songs.aNameOfASong', '==', true)
      .get()
      .then(function(querySnapshot) {
        var songLength = querySnapshot.size
        var i=0;
        querySnapshot.forEach(function(doc) {
           songs.push(doc.data())
           i ++;
           if(songLength===i){
                console.log(songs
           }
          console.log(doc.id, " => ", doc.data());
        });
       })
       .catch(function(error) {
         console.log("Error getting documents: ", error);
        });




google-cloud-firestore