फायरबेस फायरस्टार 'संदर्भ' डेटा प्रकार किसके लिए अच्छा है?


189

मैं सिर्फ नए Firebase Firestore की खोज कर रहा हूँ और यह कहा जाता है एक डेटा प्रकार हैं reference। यह मेरे लिए स्पष्ट नहीं है कि यह क्या करता है।

  • क्या यह विदेशी कुंजी जैसा है?
  • क्या इसका उपयोग उस संग्रह को इंगित करने के लिए किया जा सकता है जो कहीं और स्थित है?
  • यदि referenceएक वास्तविक संदर्भ है, तो क्या मैं इसे प्रश्नों के लिए उपयोग कर सकता हूं? उदाहरण के लिए क्या मेरे पास एक संदर्भ हो सकता है जो उपयोगकर्ता को सीधे पाठ फ़ील्ड में स्टोर करने के बजाय उपयोगकर्ता को इंगित करता है? और क्या मैं इस उपयोगकर्ता संदर्भ को क्वेरी के लिए उपयोग कर सकता हूं?

18
मुझे लगता है कि फायरबेस टीम का यह वीडियो आपके लिए इसे तोड़ देता है: youtube.com/watch?v=Elg2zDVIcLo (4:36 से देखो)
आदर्श

जवाबों:


90

संदर्भ विदेशी कुंजियों को बहुत पसंद करते हैं।

वर्तमान में जारी एसडीके अन्य परियोजनाओं के संदर्भों को संग्रहीत नहीं कर सकता है। एक परियोजना के भीतर, संदर्भ किसी भी अन्य संग्रह में किसी अन्य दस्तावेज़ को इंगित कर सकते हैं।

आप किसी भी अन्य मान की तरह प्रश्नों में संदर्भ का उपयोग कर सकते हैं: फ़िल्टर करने, ऑर्डर करने और पेजिंग के लिए (प्रारंभ / प्रारंभ के बाद)।

SQL डेटाबेस में विदेशी कुंजियों के विपरीत, संदर्भ एकल क्वेरी में जुड़ने के लिए उपयोगी नहीं होते हैं। आप उन पर निर्भर लुकअप के लिए उपयोग कर सकते हैं (जो कि जैसे लगते हैं), लेकिन सावधान रहें क्योंकि प्रत्येक हॉप सर्वर के लिए एक और गोल यात्रा का परिणाम देगा।


9
कृपया, क्या आप उपयोग के मामलों को साझा कर सकते हैं? क्या उस संदर्भ में फ़ील्ड को क्वेरी करना संभव है? जैसे मेरे पास friendsमेरे सभी दोस्तों ( friends/myId) की एक सूची है । फिर, मैं इस दस्तावेज़ friendsको दूसरे दस्तावेज़ के क्षेत्र में संदर्भित करता हूं ( group/groupId)। मैं केवल अपने दोस्तों को प्रदर्शित करना चाहता हूं जो उस समूह में हैं, कुछ इस तरह से कर रहे हैं where('friends.myId', '==', true):।
विल

107
Btw, डॉक्स को अद्यतन करने के लिए एक संदर्भ प्रकार जोड़ने का उदाहरण शामिल करना उपयोगी हो सकता है ।
विल

11
मुझे इस बारे में कोई जानकारी नहीं मिल रही है? यह मेरी पूरी डेटाबेस संरचना को बदल देगा, मुझे और जानने की जरूरत है ...
रुबेन

3
क्या आपके पास एक उदाहरण है (अधिमानतः स्विफ्ट में) संदर्भ का उपयोग करके क्वेरी कैसे करें? अभी, मैं इसे कच्चे यूआईडी को स्ट्रिंग के रूप में संग्रहीत करके कर सकता हूं, लेकिन यह सही नहीं लगता है।
मिकी चेयोंग

6
मुझे अपने सभी संदर्भ प्रकारों को स्ट्रिंग में बदलने की आवश्यकता है क्योंकि क्वेरी का संदर्भ प्रकार के साथ हमेशा विफल होगा। मैं वास्तव में संदर्भ प्रकार से क्वेरी करने के बारे में कुछ भी नहीं पा सकता हूं :( अगर किसी को पता चलता है कि संदर्भ प्रकारों से क्वेरी कैसे करें तो मुझे बताएं ...
सैम ट्रेंट

133

फायरस्टार में संदर्भों का उपयोग करके मेरे लिए जो काम किया गया है उसे नीचे जोड़ना

जैसा कि अन्य उत्तर कहते हैं, यह एक विदेशी कुंजी की तरह है। संदर्भ विशेषता संदर्भ डॉक्टर के डेटा को वापस नहीं करती है। उदाहरण के लिए, मेरे पास उत्पादों की एक सूची है, उत्पाद पर विशेषताओं में से एक के रूप में एक उपयोगकर्ता संदर्भ। उत्पादों की सूची प्राप्त करना, मुझे उस उत्पाद को बनाने वाले उपयोगकर्ता का संदर्भ देता है। लेकिन यह मुझे उस संदर्भ में उपयोगकर्ता का विवरण नहीं देता है। मैंने पॉइंटर्स के साथ अन्य बैक एंड का उपयोग किया है, इससे पहले कि "पॉप्युलेट: ट्रू" फ़्लैग हो, जो उपयोगकर्ता के संदर्भ आईडी के बजाय उपयोगकर्ता का विवरण देता है, जो यहाँ होना बहुत अच्छा होगा (उम्मीद है कि भविष्य में सुधार होगा )।

नीचे कुछ उदाहरण कोड हैं जो मैंने संदर्भ सेट करने के साथ-साथ उत्पादों की सूची का संग्रह प्राप्त करने के लिए उपयोग किए थे, फिर दिए गए उपयोगकर्ता संदर्भ आईडी से उपयोगकर्ता विवरण प्राप्त करें।

एक संग्रह पर एक संदर्भ सेट करें:

let data = {
  name: 'productName',
  size: 'medium',
  userRef: db.doc('users/' + firebase.auth().currentUser.uid)
};
db.collection('products').add(data);

प्रत्येक दस्तावेज़ (उपयोगकर्ता विवरण) पर एक संग्रह (उत्पाद) और सभी संदर्भ प्राप्त करें:

db.collection('products').get()
    .then(res => {
      vm.mainListItems = [];
      res.forEach(doc => {
        let newItem = doc.data();
        newItem.id = doc.id;
        if (newItem.userRef) {
          newItem.userRef.get()
          .then(res => { 
            newItem.userData = res.data() 
            vm.mainListItems.push(newItem);
          })
          .catch(err => console.error(err));
        } else {
          vm.mainListItems.push(newItem);  
        }

      });
    })
    .catch(err => { console.error(err) });

उम्मीद है की यह मदद करेगा


3
साझा करने के लिए धन्यवाद! मुझे लगता है कि गेट भाग की पहली पंक्ति में एक टाइपो है और यह होना चाहिए db.collection('products').get()। क्या आपने सीधे उपयोगकर्ता प्राप्त करने की कोशिश की है? मुझे अनुमान है कि newItem.userRef.get()इसके बजाय काम करना चाहिएdb.collection("users").doc(newItem.userRef.id).get()
सेर्गेई नेफेडेव

53
सबसे पहले आप उदाहरण के लिए धन्यवाद। मुझे उम्मीद है कि वे भविष्य के लिए "आबादी: सच" जोड़ देंगे। अन्यथा एक संदर्भ को सहेजना कुछ व्यर्थ है। इसके द्वारा केवल uidसंदर्भ और संदर्भ को सहेज कर ही ऐसा किया जा सकता था।
जुरगेन ब्रांडस्टेटर

4
उदाहरण के लिए धन्यवाद! लेकिन जब हम दस्तावेज़ को क्वेरी करते हैं तो "पॉप्युलेट" प्रकार का विकल्प नहीं होने पर संदर्भ प्रकार को संग्रहीत करने का क्या मतलब है? अगर कोई पॉपुलेट विकल्प है, जिसे कोई भी जानता है, तो कृपया मुझे बताएं।
हर्षिल शाह

18
तो वास्तव में यह एक विदेशी कुंजी की तरह नहीं है। मेरे लिए यह मूल रूप से कुछ भी नहीं है - referenceअगर हम इसे एक असली विदेशी कुंजी के रूप में काम नहीं कर सकते हैं तो क्या होने की बात है ?
जीन डी

14
इसलिए एक referenceसे अधिक का एकमात्र लाभ string, जिसे आप get()सीधे संदर्भ पर कॉल कर सकते हैं। अभी तक बहुत उपयोगी नहीं है। आशा है कि वे संबंधित वस्तुओं के साथ संदर्भों को स्वचालित रूप से पॉप्युलेट करने के लिए एक विकल्प जोड़ते हैं!
मॉर्गेलर

16

संदर्भ द्वारा क्वेरी करने के लिए एक जावास्क्रिप्ट समाधान की तलाश करने वालों के लिए - अवधारणा यह है कि, आपको क्वेरी कथन में 'दस्तावेज़ संदर्भ' ऑब्जेक्ट का उपयोग करने की आवश्यकता है

teamDbRef = db.collection('teams').doc('CnbasS9cZQ2SfvGY2r3b'); /* CnbasS9cZQ2SfvGY2r3b being the collection ID */
//
//
db.collection("squad").where('team', '==', teamDbRef).get().then((querySnapshot) => {
  //
}).catch(function(error) {
  //
});

(यहां जवाब के लिए कुडो: https://stackoverflow.com/a/53141199/1487867 )

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.