2017-10-11 8 views
11

फायरबेस वास्तविक समय डेटाबेस के साथ हम माता-पिता नोड पर remove() पर कॉल करके केवल एक ही कमांड वाले आइटमों की एक बड़ी सूची हटा सकते हैं (नोड हटा दिया गया है और सभी बच्चे भी हैं)।क्लाउड फायरस्टोर में संग्रह "एकल थोक" संग्रह क्यों संभव नहीं है जैसे रीयलटाइम डेटाबेस के साथ है?

लेकिन इस firestore (https://firebase.google.com/docs/firestore/manage-data/delete-data#collections) के साथ दस्तावेज़ के अनुसार:
एक संग्रह हम एक बैच है कि इसके सभी दस्तावेजों से अधिक लूप और उन्हें एक एक करके नष्ट करने के लिए होगा कोड करने के लिए है हटाने के लिए।

यह बिल्कुल कुशल नहीं है। क्या ऐसा इसलिए है क्योंकि फायरस्टोर बीटा संस्करण में है या क्या यह एक एकल कॉल में पूर्ण नोड (संग्रह) को हटाने के लिए संरचनात्मक रूप से असंभव है?

उत्तर

11

आरटीडीबी ऐसा करने में सक्षम है क्योंकि प्रत्येक डेटाबेस एक ही क्षेत्र में स्थानीय है। एक धारावाहिक दृश्य प्रदान करने के लिए, जब आप remove() पर कॉल करते हैं, तो डेटाबेस निष्कासन पूरा होने तक अन्य सभी कार्यों को रोक देता है।

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

दूसरी ओर फायरस्टोर अधिक पारंपरिक Google-स्टाइल स्टोरेज इंफ्रास्ट्रक्चर पर आधारित है जहां विभिन्न श्रेणियों को dynamically to different servers असाइन किया जाता है (स्टोरेज वास्तव में बिगटेबल द्वारा समर्थित नहीं है, लेकिन समान सिद्धांत लागू होते हैं)। इसका मतलब है कि डेटा हटाना अब एक क्षेत्रीय कार्रवाई नहीं है और यह प्रभावी ढंग से हटाने को लेनदेन के रूप में प्रकट करने के लिए बहुत महंगा हो जाता है। फायरस्टोर लेनदेन वर्तमान में 100 प्रतिभागियों तक सीमित हैं और इसका मतलब है कि कोई भी गैर-तुच्छ लेनदेन थोक हटाना असंभव है।

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

फायरस्टोर एक नया उत्पाद है और अभी भी बहुत सी चीजें हैं। दुर्भाग्यवश इसने कटौती नहीं की है। हालांकि यह कुछ ऐसा है जो हम अंततः संबोधित करने की उम्मीद करते हैं, जब मैं ऐसा समय रेखा प्रदान नहीं कर सकता।

इस बीच कंसोल और firebase command-line दोनों ऐसा करने का एक गैर-लेनदेन साधन प्रदान करते हैं, उदा। परीक्षण स्वचालन के लिए।

फायरस्टोर की कोशिश करने के लिए आपकी समझ और धन्यवाद के लिए धन्यवाद!

+0

मुझे लगता है कि फायरस्टोर दस्तावेज़ (प्रश्न में @toofoo द्वारा लिंक) में उदाहरण गलत है। 'resolve() 'को कॉल किया जाना चाहिए जब' (numDeleted == 0) '। – Leo

+0

बीटीडब्ल्यू, वर्तमान में बैच के रूप में अपलोड किया जाना चाहिए? या लेनदेन का इस्तेमाल किया जा सकता है? – Leo

+0

और एक और सवाल। आपने लेनदेन संबंधी व्यवहार का वादा किए बिना "थोक विलोपन" लिखा था। मुझे लेनदेन संबंधी व्यवहार की ज़रूरत है। क्या मैं इसके लिए आशा कर सकता हूं? – Leo

1

मैं रीयलटाइम डेटाबेस से फायरस्टोर के लिए अपने ऐप को खुशी से दोबारा प्रतिक्रिया दे रहा था, छोटे कोड और सरल वाक्यविन्यास का आनंद ले रहा था, जब तक कि मैंने डिलीट() फ़ंक्शंस को दोबारा नहीं किया! Subcollections के साथ एक दस्तावेज़ को हटाने के लिए:

  • वादे की एक सरणी बनाएं।
  • get() एक उप-संग्रह, जिसमें आगे उप-चयन नहीं हैं।
  • उप-चयन में प्रत्येक दस्तावेज़ को पढ़ने के लिए forEach() फ़ंक्शन के माध्यम से Iterate।
  • प्रत्येक दस्तावेज़ हटाएं, और हटाए गए आदेश को वादों की सरणी में धक्का दें।
  • अगले उप-संग्रह पर जाएं और इसे दोहराएं।
  • सभी उप-चयन हटा दिए जाने तक प्रतीक्षा करने के लिए Promise.all(arrayOfPromises) का उपयोग करें।
  • फिर शीर्ष-स्तरीय दस्तावेज़ हटाएं।
आदि आप बनाने के लिए है कि एक समारोह है, तो यह एक और समारोह से अगले उच्च परत प्राप्त करने के लिए फोन चाहता हूँ संग्रह और दस्तावेजों की बहु परतों,

साथ

आप कंसोल में देख सकते हैं। संग्रह और दस्तावेजों को मैन्युअल रूप से हटाने के लिए, दाएं-अधिकतर दस्तावेज़ को हटाएं, फिर दाएं-अधिक संग्रह को हटाएं, और बाएं काम करने पर।

यहां मेरा कोड है, AngularJS में। यह केवल तभी काम करता है जब उप-संग्रह संग्रह उप-चयन से पहले हटाया नहीं गया था।

$scope.deleteClip = function(docId) { 
if (docId === undefined) { 
docId = $scope.movieOrTvShow + '_' + $scope.clipInMovieModel; 
} 
$scope.languageVideos = longLanguageFactory.toController($scope.language) + 'Videos'; 
var promises = []; 
firebase.firestore().collection($scope.languageVideos).doc($scope.movieOrTvShow).collection('Video Clips').doc(docId).collection('SentenceTranslations').get() 
.then(function(translations) { 
    translations.forEach(function(doc) { 
    console.log(doc.id); 
    promises.push(firebase.firestore().collection($scope.languageVideos).doc($scope.movieOrTvShow).collection('Video Clips').doc(docId).collection('SentenceTranslations').doc(doc.id).delete()); 
    }); 
}); 
firebase.firestore().collection($scope.languageVideos).doc($scope.movieOrTvShow).collection('Video Clips').doc(docId).collection('SentenceExplanations').get() 
.then(function(explanations) { 
    explanations.forEach(function(doc) { 
    console.log(doc.id); 
    promises.push(firebase.firestore().collection($scope.languageVideos).doc($scope.movieOrTvShow).collection('Video Clips').doc(docId).collection('SentenceExplanations').doc(doc.id).delete()); 
    }); 
}); 
Promise.all(promises).then(function() { 
    console.log("All subcollections deleted."); 
    firebase.firestore().collection($scope.languageVideos).doc($scope.movieOrTvShow).collection('Video Clips').doc(docId).delete() 
    .then(function() { 
    console.log("Collection deleted."); 
    $scope.clipInMovieModel = null; 
    $scope.$apply(); 
    }) 
    .catch(function(error) { 
    console.log("Remove failed: " + error.message); 
    }); 
}) 
.catch(function(error){ 
    console.log("Error deleting subcollections: " + error); 
}); 
}; 

रीयलटाइम डेटाबेस में यह एक पंक्ति होगी।

संबंधित मुद्दे