संग्रह, प्रकाशन और सदस्यताएँ उल्का का एक मुश्किल क्षेत्र है, कि प्रलेखन अधिक विस्तार से चर्चा कर सकता है, ताकि बार-बार भ्रम से बचा जा सके , जो कभी-कभी भ्रमित शब्दावली से बढ़ जाता है ।
यहाँ के साचा दु: ख (के सह लेखक DiscoverMeteor ) एक स्लाइड में प्रकाशन और सदस्यता समझा:
यह समझने के लिए कि आपको find()
एक से अधिक बार कॉल करने की आवश्यकता क्यों है , आपको यह समझने की आवश्यकता है कि उल्का में संग्रह, प्रकाशन और सदस्यता कैसे काम करते हैं:
आप MongoDB में संग्रह परिभाषित करते हैं। कोई उल्का अभी तक शामिल नहीं है। इन संग्रहों में मैंगो और उल्का दोनों द्वारा डेटाबेस रिकॉर्ड ("दस्तावेज" भी कहा जाता है , लेकिन डेटाबेस रिकॉर्ड में "दस्तावेज़" अधिक सामान्य है, उदाहरण के लिए, एक अद्यतन विनिर्देश या एक क्वेरी चयनकर्ता भी दस्तावेज़ हैं - जावास्क्रिप्ट ऑब्जेक्ट्स जोड़े वाले)।field: value
फिर आप उल्का सर्वर पर संग्रह को परिभाषित करते हैं
MyCollection = new Mongo.Collection('collection-name-in-mongo')
इन संग्रहों में MongoDB संग्रह के सभी डेटा शामिल हैं , और आप उन MyCollection.find({...})
पर चला सकते हैं, जो एक कर्सर (रिकॉर्ड का एक सेट, उनके माध्यम से पुनरावृति करने के तरीकों के साथ और उन्हें वापस लौटाएगा)।
यह कर्सर (अधिकांश समय) रिकॉर्ड का एक सेट ( "रिकॉर्ड सेट" कहा जाता है) प्रकाशित करने के लिए उपयोग किया जाता है । आप वैकल्पिक रूप से उन अभिलेखों से केवल कुछ फ़ील्ड प्रकाशित कर सकते हैं । यह रिकॉर्ड सेट ( संग्रह नहीं ) है जो ग्राहक सदस्यता लेते हैं। प्रकाशन एक प्रकाशन फ़ंक्शन द्वारा किया जाता है , जिसे हर बार एक नए ग्राहक की सदस्यता मिलती है, और जो कि प्रबंधन करने के लिए पैरामीटर ले सकता है (उदाहरण के लिए उपयोगकर्ता आईडी, केवल उस उपयोगकर्ता के दस्तावेज़ वापस करने के लिए)।
क्लाइंट पर , आपके पास मिनिमॉन्गो संग्रह हैं जो आंशिक रूप से सर्वर से रिकॉर्ड के कुछ दर्पण हैं । "आंशिक रूप से" क्योंकि उनमें केवल कुछ फ़ील्ड हो सकते हैं, और "कुछ रिकॉर्ड्स" क्योंकि आप आमतौर पर क्लाइंट को केवल उन रिकॉर्ड्स को भेजना चाहते हैं, जो पेज लोड करने की गति बढ़ाते हैं, और केवल उन्हीं की आवश्यकता होती है और जिनके पास अनुमति है पहुंच।
मिनिमॉन्गो मूल रूप से एक शुद्ध-स्मृति है, शुद्ध जावास्क्रिप्ट में मोंगो का निरंतर-कार्यान्वयन। यह एक स्थानीय कैश के रूप में कार्य करता है जो उस डेटाबेस के सबसेट को स्टोर करता है जिसके साथ यह क्लाइंट काम कर रहा है। सर्वर से बात किए बिना, क्लाइंट (खोज) पर क्वेरीज़ सीधे इस कैश से दी जाती हैं।
ये मिनीमोंगो संग्रह शुरू में खाली हैं। वे भर रहे हैं
Meteor.subscribe('record-set-name')
कहता है। ध्यान दें कि सदस्यता के लिए पैरामीटर एक संग्रह नाम नहीं है; यह एक रिकॉर्ड सेट का नाम है जिसे सर्वर publish
कॉल में उपयोग करता है । subscribe()
कॉल एक करने के लिए ग्राहक सब्सक्राइब रिकॉर्ड सेट सब के साथ (जैसे हाल ही में 100 ब्लॉग पोस्ट) सर्वर संग्रह से रिकॉर्ड के सबसेट, या एक (केवल उदाहरण के लिए प्रत्येक रिकॉर्ड में फ़ील्ड के सबसेट - title
और date
)। मिनिमॉन्गो को आने वाले रिकॉर्ड्स को रखने के लिए किस संग्रह में पता है? संग्रह का नाम होगा collection
प्रकाशित हैंडलर दशक में उपयोग किया तर्क added
, changed
और removed
कॉलबैक, या अगर उन (इस स्थिति समय के सबसे अधिक है) याद कर रहे हैं, यह सर्वर पर MongoDB संग्रह का नाम हो जाएगा।
रिकॉर्ड को संशोधित करना
यह वह जगह है जहां उल्का चीजों को बहुत सुविधाजनक बनाती है: जब आप ग्राहक पर मिनिमोंगो संग्रह में एक रिकॉर्ड (दस्तावेज़) को संशोधित करते हैं, तो उल्का तुरंत उस पर निर्भर सभी टेम्प्लेट को अपडेट कर देगा, और सर्वर में परिवर्तन भी वापस भेज देगा, जो बदले में MongoDB में परिवर्तनों को संग्रहीत करेगा और उन्हें उन उपयुक्त ग्राहकों को भेजेगा जिन्होंने उस दस्तावेज़ सहित रिकॉर्ड सेट की सदस्यता ली है। इसे विलंबता क्षतिपूर्ति कहा जाता है और यह उल्का के सात मूल सिद्धांतों में से एक है ।
एकाधिक सदस्यताएँ
आपके पास सदस्यता का एक गुच्छा हो सकता है जो अलग-अलग रिकॉर्ड में खींचते हैं, लेकिन वे सभी क्लाइंट पर एक ही संग्रह में समाप्त हो जाएंगे यदि सर्वर पर एक ही संग्रह से आया हो, उनके आधार पर _id
। यह स्पष्ट रूप से नहीं बताया गया है, लेकिन उल्का डॉक्स द्वारा निहित है:
जब आप रिकॉर्ड सेट की सदस्यता लेते हैं, तो यह क्लाइंट को रिकॉर्ड भेजने के लिए सर्वर को बताता है। ग्राहक दुकानों स्थानीय Minimongo संग्रह में इन रिकॉर्ड, के रूप में एक ही नाम के साथ collection
में इस्तेमाल तर्क हैंडलर के प्रकाशित added
, changed
और removed
कॉलबैक। उल्का आने वाली विशेषताओं को कतारबद्ध करेगा जब तक कि आप ग्राहक पर Mongo.Collection को मिलान संग्रह नाम के साथ घोषित नहीं करते।
स्पष्ट नहीं है कि क्या होता है जब आप स्पष्ट रूप से उपयोग नहीं करते हैं added
, changed
और removed
सभी पर हैंडलर प्रकाशित करते हैं - जो कि ज्यादातर समय होता है। इस सबसे सामान्य मामले में, संग्रह तर्क है (बिना सोचे समझे) उस नाम से लिया गया MongoDB संग्रह जिसे आपने चरण 1 पर सर्वर पर घोषित किया था। लेकिन इसका मतलब यह है कि आपके पास अलग-अलग नामों के साथ अलग-अलग प्रकाशन और सदस्यताएँ हो सकती हैं, और सभी रिकॉर्ड क्लाइंट पर एक ही संग्रह में समाप्त हो जाएंगे। शीर्ष स्तर के क्षेत्रों के स्तर के नीचे , उल्का दस्तावेजों के बीच एक सेट यूनियन का प्रदर्शन करने के लिए ध्यान रखता है, जैसे कि सदस्यताएं ओवरलैप कर सकती हैं - उन कार्यों को प्रकाशित करती हैं जो क्लाइंट के लिए अलग-अलग शीर्ष स्तर के फ़ील्ड को कंधे से कंधा मिलाकर और क्लाइंट पर दस्तावेज़ में भेजती हैं। संग्रह होगाखेतों के दो सेटों का मिलन ।
उदाहरण: ग्राहक पर एक ही संग्रह भरने वाली कई सदस्यताएँ
आपके पास एक BlogPosts संग्रह है, जिसे आप सर्वर और क्लाइंट दोनों पर समान तरीके से घोषित करते हैं, भले ही यह अलग-अलग चीजें करता हो:
BlogPosts = new Mongo.Collection('posts');
क्लाइंट पर, BlogPosts
से रिकॉर्ड प्राप्त कर सकते हैं:
सबसे हाल ही में 10 ब्लॉग पोस्ट की सदस्यता
Meteor.publish('posts-recent', function publishFunction() {
return BlogPosts.find({}, {sort: {date: -1}, limit: 10});
}
Meteor.subscribe('posts-recent');
वर्तमान उपयोगकर्ता के पदों की सदस्यता
Meteor.publish('posts-current-user', function publishFunction() {
return BlogPosts.find({author: this.userId}, {sort: {date: -1}, limit: 10});
}
Meteor.publish('posts-by-user', function publishFunction(who) {
return BlogPosts.find({authorId: who._id}, {sort: {date: -1}, limit: 10});
}
Meteor.subscribe('posts-current-user');
Meteor.subscribe('posts-by-user', someUser);
सबसे लोकप्रिय पदों के लिए एक सदस्यता
- आदि।
ये सभी दस्तावेज posts
MongoDB में BlogPosts
संग्रह से सर्वर पर संग्रह के माध्यम से आते हैं , और BlogPosts
क्लाइंट पर संग्रह में समाप्त होते हैं ।
अब हम समझ सकते हैं कि आपको find()
एक से अधिक बार कॉल करने की आवश्यकता क्यों है - दूसरी बार क्लाइंट पर होने के कारण, क्योंकि सभी सदस्यता के दस्तावेज़ एक ही संग्रह में समाप्त हो जाएंगे, और आपको केवल उन लोगों को लाने की ज़रूरत है जिनकी आप परवाह करते हैं। उदाहरण के लिए, क्लाइंट पर सबसे हालिया पोस्ट प्राप्त करने के लिए, आप सर्वर से क्वेरी को मिरर करते हैं:
var recentPosts = BlogPosts.find({}, {sort: {date: -1}, limit: 10});
यह सभी दस्तावेज़ों / रिकॉर्डों के लिए एक कर्सर लौटाएगा जो क्लाइंट को अब तक, शीर्ष पदों और उपयोगकर्ता के पदों दोनों से मिला है। ( धन्यवाद जेफ्री )।
BlogPosts.find({})
दोनों प्रकाशनों की सदस्यता लेने के बाद ग्राहक पर करते हैं, तो यह होता है - अर्थात यह ग्राहक के सभी दस्तावेजों / अभिलेखों का एक कर्सर लौटाएगा, जो शीर्ष पदों और उपयोगकर्ता के पदों दोनों पर होगा। मैंने SO पर अन्य प्रश्न देखे हैं जहाँ प्रश्नकर्ता इससे भ्रमित था।