2013-07-17 7 views
6

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

मैं स्वत: पूर्ण इनपुट के आधार पर संग्रह और प्रकाशन-सदस्यता का उपयोग करना चाहता हूं क्योंकि मैं नहीं चाहता कि क्लाइंट पूर्ण डेटाबेस (5 एमबी) डाउनलोड करे। क्या प्रदर्शन के लिए, उल्का बताने का कोई तरीका है कि यह संग्रह "स्थैतिक" है? या इससे कोई फर्क नहीं पड़ता?

क्या कोई भी एक अलग दृष्टिकोण सुझा सकता है?

उत्तर

7

जब आप "सर्वर है कि एक संग्रह स्थिर है बताना चाहता हूँ", मैं दो संभावित अनुकूलन के बारे में पता कर रहा हूँ:

  1. एक जीवित क्वेरी का उपयोग कर, क्योंकि डेटा
  2. कभी नहीं बदलेगा डेटाबेस का पालन न करें क्योंकि यह पता लगाया और अन्य डेटा (बचत स्मृति और CPU) के साथ तुलना में जाने की जरूरत नहीं है
  3. merge box में इस क्वेरी के परिणाम की दुकान मत करो

(1) कुछ आप बल्कि आसानी से कर सकते है अपना खुद का प्रकाशित कर्सर बनाकर। हालांकि, यदि कोई ग्राहक एक ही प्रश्न देख रहा है, तो मेरा मानना ​​है कि उल्का (कम से कम भविष्य में) इसके लिए अनुकूलित होगा, इसलिए यह अभी भी किसी भी ग्राहक के लिए सिर्फ एक लाइव क्वेरी है। के रूप में (2), मुझे ऐसा करने के किसी भी सीधा तरीके से अवगत नहीं है क्योंकि यह संभावित रूप से multiple publications and subscriptions पर विलय करने वाले डेटा को गड़बड़ कर सकता है।

लाइव क्वेरी का उपयोग करने से बचने के लिए, आप कर्सर को वापस करने के बजाय मैन्युअल रूप से प्रकाशित फ़ंक्शन में डेटा जोड़ सकते हैं, जिससे सदस्यता के लिए डेटा को हुक करने के लिए .observe() फ़ंक्शन कहा जा सकता है। यहाँ एक सरल उदाहरण है:

Meteor.publish(function() { 
    var sub = this; 
    var args = {}; // what you're find()ing 

    Foo.find(args).forEach(function(document) { 
     sub.added("client_collection_name", document._id, document); 
    }); 

    sub.ready(); 
}); 

इस कारण होगा डेटा क्लाइंट की तरफ client_collection_name में जोड़े जाने की है, जो संग्रह Foo द्वारा संदर्भित, या कुछ और के रूप में एक ही नाम हो सकता था। ध्यान रखें कि आप क्या कर सकते हैं many other things with publications बनें

अद्यतन (यह भी, ऊपर लिंक देखें।): से (2) है, जो संभवतः कई समस्याएं खड़ी संग्रह के आकार के आधार हो सकता है, यह बाईपास के लिए आवश्यक है समस्याओं के समाधान के उल्का पूरी तरह से। इसे करने के लिए एक तरीके से https://stackoverflow.com/a/21835534/586086 देखें। एक और तरीका यह है कि एक विधि कॉल के रूप में संग्रह fetch() एड को वापस लौटना है, हालांकि इसमें संपीड़न के लाभ नहीं हैं।

+1

इस # 2 तक स्वीकार जवाब सुलझाया जा सकता है किया जाना चाहिए। धन्यवाद एंड्रयू –

+1

@WesJohnson # 2 को हल करने के लिए http://stackoverflow.com/a/21835534/586086 देखें। मैं कुछ समय पर यह उत्तर भी अपडेट करूंगा। –

3

उल्का दस्तावेज़ से: "कर्सर में दस्तावेज़ों को बदलने वाले संग्रह में कोई भी बदलाव एक पुनर्मूल्यांकन को ट्रिगर करेगा। इस व्यवहार को अक्षम करने के लिए, {प्रतिक्रियाशील: झूठी} को खोजने के विकल्प के रूप में पास करें।"

मुझे लगता है कि यह आसान विकल्प सर्वश्रेष्ठ उत्तर

+0

'प्रतिक्रियाशील: झूठा 'केवल क्लाइंट-साइड काम करता है। –

0

आप अपने पूरे संग्रह प्रकाशित करने की जरूरत नहीं है।
1. उपयोगकर्ता के पहले 3 अक्षरों को इनपुट करने के बाद ही स्वत: पूर्ण विकल्प दिखाएं - यह आपकी खोज को महत्वपूर्ण रूप से संकीर्ण करेगा।
2. विकल्पों के रूप में 5-10 से अधिक शहरों को प्रदान न करें - यह आपके रिकॉर्डसेट को वास्तव में छोटा रखेगा - इस प्रकार प्रत्येक उपयोगकर्ता को 5 एमबी डेटा धक्का देने की आवश्यकता नहीं है।
आपका प्रकाशन इस तरह दिखना चाहिए:

Meteor.publish('pub-name', function(userInput){ 
    var firstLetters = new RegExp('^' + userInput); 
    return Cities.find({name:firstLetters},{limit:10,sort:{name:1}}); 
}); 
संबंधित मुद्दे

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