खोज…


टिप्पणियों

मानगो संग्रह के बारे में सोचने का एक उपयोगी तरीका हू, व्हाट, व्हेन, व्हेयर, व्हाई और हाउ के संदर्भ में है। मोंगो में विभिन्न प्रकार के डेटा के लिए निम्नलिखित अनुकूलन हैं:

कहां - जियोसन
जब - ऑब्जेक्टिड टाइमस्टैम्प
कौन - उल्का खाता स्ट्रिंग्स
कैसे - निर्णय पेड़ों के लिए JSON

जो मानगो में डिफ़ॉल्ट दस्तावेज़ को मोटे तौर पर 'क्या' का प्रतिनिधित्व करता है।

एक विरासत डेटाबेस में रिकॉर्ड बनाना

आप अपने संग्रह को idGeneration फ़ील्ड के साथ परिभाषित करके सामान्य मानगो प्रारूप में डिफ़ॉल्ट कर सकते हैं।

MyCollection = new Meteor.Collection('mycollection', {idGeneration : 'MONGO'});

दस्तावेज़ में डेटा सम्मिलित करना

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

Todos.insert({
  text: "foo",                        // String
  listId: Session.get('list_id'),     // String
  value: parseInt(2),                 // Number
  done: false,                        // Boolean
  createdAt: new Date(),              // Dimestamp
  timestamp: (new Date()).getTime(),  // Time
  tags: []                            // Array
});

सबसे हाल ही में बनाए गए दस्तावेज़ का _id प्राप्त करना

आप इसे या तो सिंक्रोनाइज़ कर सकते हैं:

var docId = Todos.insert({text: 'foo'});
console.log(docId);

या एसिंक्रोनस रूप से:

Todos.insert({text: 'foo'}, function(error, docId){
  console.log(docId);
});

समय श्रृंखला डेटा

आधिकारिक श्रृंखला और प्रस्तुतियों के साथ टाइम सीरीज़ डेटा के लिए MongoDB का उपयोग करना एक बहुत अच्छी तरह से प्रलेखित और स्थापित उपयोग-केस है। समय श्रृंखला डेटा के लिए अपने स्वयं के स्कीमा का आविष्कार करने की कोशिश करने से पहले MongoDB से आधिकारिक दस्तावेज पढ़ें और देखें।

टाइम सीरीज डेटा के लिए MongoDB

सामान्य तौर पर, आप अपने समय के डेटा के लिए "बकेट" बनाना चाहेंगे:

DailyStats.insert({
   "date" : moment().format("MM-DD-YYYY"),
   "dateIncrement" : moment().format("YYYYMMDD"),
   "dailyTotal" : 0,
   'bucketA': 0,
   'bucketB': 0,
   'bucketC': 0
   });

और फिर उन बाल्टियों को बढ़ाएं क्योंकि डेटा आपके आवेदन में फीड होता है। इस वेतन वृद्धि को एक उल्का विधि, एक संग्रह पर्यवेक्षक, एक रीस्ट एपीआई समापन बिंदु और विभिन्न अन्य स्थानों पर रखा जा सकता है।

DailyStats.update({_id: doc._id}, {$inc: {bucketA: 1} });

अधिक पूर्ण उल्का उदाहरण के लिए, क्लिनिकल उल्का ट्रैक से उदाहरण देखें:

रीयलटाइम एनालिटिक्स पाइपलाइन
क्लिनिकल उल्का - रेखांकन - डैलिस्टाट्स

Regexes के साथ फ़िल्टरिंग

सर्वर पर सदस्यताएँ फ़िल्टर करने के लिए सरल पैटर्न, रेगेक्स, प्रतिक्रियाशील सत्र चर, और ऑटो ऑटोरन का उपयोग करना।

// create our collection
WordList =  new Meteor.Collection("wordlist");

// and a default session variable to hold the value we're searching for
Session.setDefault('dictionary_search', '');

Meteor.isClient(function(){
    // we create a reactive context that will rerun items when a Session variable gets updated 
    Deps.autorun(function(){
        // and create a subscription that will get re-subscribe to when Session variable gets updated
        Meteor.subscribe('wordlist', Session.get('dictionary_search'));
    });

    Template.dictionaryIndexTemplate.events({
        'keyup #dictionarySearchInput': function(evt,tmpl){
            // we set the Session variable with the value of our input when it changes
            Session.set('dictionary_search', $('#dictionarySearchInput').val());
        },
        'click #dictionarySearchInput':function(){
            // and clear the session variable when we enter the input
            Session.set('dictionary_search', '');
        },
    });
});
Meteor.isServer(function(){
    Meteor.publish('wordlist', function (word_search) {
        // this query gets rerun whenever the client subscribes to this publication
        return WordList.find({
            // and here we do our regex search
            Word: { $regex: word_search, $options: 'i' }
        },{limit: 100});
    });
});

और क्लाइंट पर उपयोग किया जाने वाला HTML:

<input id="dictionarySearchInput" type="text" placeholder="Filter..." value="hello"></input>

यह पैटर्न अपने आप में बहुत सीधा है, लेकिन रेगेक्स नहीं हो सकता है। यदि आप रीगेक्स से परिचित नहीं हैं, तो यहां कुछ उपयोगी ट्यूटोरियल और लिंक दिए गए हैं:

नियमित अभिव्यक्ति ट्यूटोरियल
नियमित अभिव्यक्ति धोखा शीट
जावास्क्रिप्ट में नियमित अभिव्यक्तियाँ

भू-स्थानिक संग्रह - अधिक सीखना

भू-स्थानिक संग्रह में आम तौर पर मैंगो डेटाबेस में जियोजन्स को संग्रहीत करना, क्लाइंट को उस डेटा को स्ट्रीमिंग करना, ब्राउज़र की window.navigator.geolocation तक window.navigator.geolocation , मैप एपीआई को लोड करना, जियोजेन्स को लाटल में परिवर्तित करना और मानचित्र पर प्लॉटिंग शामिल है। अधिमानतः सभी realtime में। आपको शुरू करने के लिए संसाधनों की एक सूची इस प्रकार है:

ऑडिटिंग संग्रह प्रश्न

निम्न उदाहरण आपके सभी संग्रह प्रश्नों को सर्वर कंसोल में लॉग इन करेगा।

Meteor.startup(     
  function () {     
    var wrappedFind = Meteor.Collection.prototype.find;     

    // console.log('[startup] wrapping Collection.find')        

    Meteor.Collection.prototype.find = function () {        
      // console.log(this._name + '.find', JSON.stringify(arguments))       
      return wrappedFind.apply(this, arguments);        
    }       
  },        

  function () {     
    var wrappedUpdate = Meteor.Collection.prototype.update;     

    // console.log('[startup] wrapping Collection.find')        

    Meteor.Collection.prototype.update = function () {      
      console.log(this._name + '.update', JSON.stringify(arguments))        
      return wrappedUpdate.apply(this, arguments);      
    }       
  }     
);      

प्रेक्षक और कार्यकर्ता कार्य

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

Meteor.startup(function(){
  console.log('starting worker....');

  var dataCursor = Posts.find({viewsCount: {$exists: true}},{limit:20});

  var handle = dataCursor.observeChanges({
    added: function (id, record) {
      if(record.viewsCount > 10){
         // run some statistics
         calculateStatistics();

         // or update a value
         Posts.update({_id: id}, {$set:{
           popular: true
         }});

      }
    },
    removed: function () {
      console.log("Lost one.");
    }
  });
});

नोट 20 की सीमा derailleur का आकार है .... इसके कितने दांत हैं; या, अधिक विशेष रूप से, कर्सर में कितने आइटम हैं क्योंकि यह संग्रह पर चल रहा है। इस तरह के फ़ंक्शन में 'var' कीवर्ड का उपयोग करने के बारे में सावधान रहें। संभव के रूप में स्मृति के लिए कुछ वस्तुओं के रूप में लिखें, और जोड़ा विधि के अंदर ऑब्जेक्ट पुन: उपयोग पर ध्यान केंद्रित करें। जब ऑप्सलॉग चालू हो जाता है, और यह बात पूरी गति से चल रही है, तो यह गंदा मेमोरी लीक को उजागर करने के लिए एक प्रमुख उम्मीदवार है यदि यह मेमोरी हीप पर ऑब्जेक्ट्स को तेजी से लिख रहा है, तो नोड कचरा कचरा कलेक्टर चीजों को साफ करने में सक्षम है।

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

percolatestudios:synced-cron देखें percolatestudios:synced-cron एक क्लस्टर में कई मशीनों में सेवा श्रमिकों को सिंक्रनाइज़ करने के उत्कृष्ट उदाहरण के लिए सिंक किए गए percolatestudios:synced-cron पैकेज।
उल्का के अनुसार सिंक-क्रॉन



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow