firebase - Google Firestore-एक दौर की यात्रा में कई आईडी द्वारा दस्तावेज़ कैसे प्राप्त करें?




google-cloud-firestore (5)

मैं सोच रहा हूं कि क्या फायरस्टार को एक राउंड ट्रिप (नेटवर्क कॉल) में आईडी की सूची द्वारा कई दस्तावेज प्राप्त करना संभव है।


आप इस तरह एक समारोह का उपयोग कर सकते हैं:

function getById (path, ids) {
  return firestore.getAll(
    [].concat(ids).map(id => firestore.doc(`${path}/${id}`))
  )
}

इसे एक एकल आईडी के साथ कहा जा सकता है:

getById('collection', 'some_id')

या आईडी की एक सरणी:

getById('collection', ['some_id', 'some_other_id'])

जो सबसे अच्छा आप कर सकते हैं वह है Promise.all उपयोग अपने ग्राहक के रूप में नहीं करना चाहिए फिर आगे बढ़ने से पहले .all का इंतजार करें।

रीडर्स को Iterate करें और उन्हें स्वतंत्र रूप से हल करने दें। क्लाइंट की ओर से, यह संभवतया UI पर उबलता है जिसमें कई प्रगति लोडर चित्र हैं जो स्वतंत्र रूप से मानों का समाधान करते हैं। हालाँकि, यह पूरे क्लाइंट को .all करने से बेहतर है जब तक कि .all

इसलिए, सभी सिंक्रोनस परिणामों को तुरंत दृश्य में डंप करें, फिर असिंक्रोनस परिणामों को व्यक्तिगत रूप से हल करने दें। यह पेटी डिस्टिंक्शन जैसा लग सकता है, लेकिन यदि आपके क्लाइंट में इंटरनेट कनेक्टिविटी खराब है (जैसे कि वर्तमान में मैं इस कॉफी शॉप में हूं), तो कई सेकंड के लिए पूरे क्लाइंट अनुभव को फ्रीज करने से 'इस ऐप बेकार' का अनुभव होगा।


निश्चित रूप से ऐसा करने का सबसे अच्छा तरीका क्लाउड फंक्शन में फायरस्टार की वास्तविक क्वेरी को लागू करना है? इसके बाद क्लाइंट से फायरबेस के लिए केवल एक ही राउंड ट्रिप कॉल होगी, जो ऐसा लगता है कि आप क्या पूछ रहे हैं।

आप वास्तव में इस सर्वर साइड की तरह अपने सभी डेटा एक्सेस लॉजिक को रखना चाहते हैं।

आंतरिक रूप से फायरबेस को स्वयं कॉल करने की समान संख्या होगी, लेकिन वे सभी बाहरी नेटवर्क के बजाय Google के सुपर-फास्ट इंटरकनेक्ट पर होंगे, और पाइपलाइनिंग के साथ संयुक्त होंगे जिसे फ्रैंक वैन पफलेन ने समझाया है, आपको उत्कृष्ट प्रदर्शन मिलना चाहिए यह दृष्टिकोण।


फिलहाल फायरस्टार में यह संभव नहीं लगता। मुझे समझ नहीं आ रहा है कि अलेक्जेंडर का जवाब क्यों स्वीकार किया जाता है, जिस समाधान का वह प्रस्ताव करता है वह "उपयोगकर्ता" संग्रह में सभी दस्तावेजों को वापस करता है।

आपको जो करने की आवश्यकता है, उसके आधार पर, आपको उस प्रासंगिक डेटा को डुप्लिकेट करना चाहिए, जिसे आपको प्रदर्शित करने की आवश्यकता है और आवश्यकता होने पर केवल एक पूर्ण दस्तावेज़ का अनुरोध करें।


व्यवहार में आप इस तरह firestore.getAll का उपयोग करेंगे

async getUsers({userIds}) {
    const refs = userIds.map(id => this.firestore.doc(`users/${id}`))
    const users = await this.firestore.getAll(...refs)
    console.log(users.map(doc => doc.data()))
}

या वादा सिंटैक्स के साथ

getUsers({userIds}) {
    const refs = userIds.map(id => this.firestore.doc(`users/${id}`))
    this.firestore.getAll(...refs).then(users => console.log(users.map(doc => doc.data())))
}




google-cloud-firestore