Ricerca…


Osservazioni

Un modo utile per pensare alle collezioni Mongo è in termini di Chi, Cosa, Quando, Dove, Perché e Come. Mongo ha le seguenti ottimizzazioni per diversi tipi di dati:

Dove - GeoJSON
Quando - Indicatori data e ora di ObjectID
Who - Meteor Account Strings
Come - JSON per gli alberi decisionali

Il che lascia il documento predefinito in Mongo che rappresenta approssimativamente un 'cosa'.

Creazione di record in un database precedente

Puoi impostare il formato Mongo normale definendo le tue raccolte con il campo idGeneration.

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

Inserimento di dati in un documento

Molti principianti in Mongo sono in difficoltà con le nozioni di base, come ad esempio l'inserimento di un array, data, booleano, variabile di sessione e così via in un record di documento. Questo esempio fornisce alcune indicazioni sugli input di dati di base.

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
});

Ottenere il _id del documento creato più di recente

Puoi ottenerlo in modo sincrono:

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

O in modo asincrono:

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

Dati degli orari

L'utilizzo di MongoDB per i dati delle serie temporali è un documento molto valido e un caso d'uso consolidato, con white paper ufficiali e presentazioni. Leggi e guarda la documentazione ufficiale di MongoDB prima di provare a inventare i tuoi schemi per i dati delle serie temporali.

MongoDB per i dati delle serie temporali

In generale, ti consigliamo di creare "bucket" per i tuoi dati di timeseries:

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

E quindi incrementare quei bucket come feed di dati nell'applicazione. Questo incremento può essere inserito in un metodo Meteor, un osservatore di raccolta, un endpoint dell'API REST e varie altre posizioni.

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

Per un esempio di Meteor più completo, vedere gli esempi dalla traccia Clinical Meteor:

Pipeline di analisi in tempo reale
Meteora clinica - Grafici - Dailystats

Filtro con Regexes

Semplice schema per filtrare le sottoscrizioni sul server, usando espressioni regolari, variabili di sessione reattive e autores deps.

// 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});
    });
});

E l'HTML che viene utilizzato sul client:

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

Questo modello di per sé è abbastanza semplice, ma le regex potrebbero non esserlo. Se non hai familiarità con le espressioni regolari, ecco alcuni utili tutorial e link:

Esercitazione di espressioni regolari
Foglio dell'espressione regolare
Espressioni regolari in Javascript

Collezioni geospaziali - Apprendimento di più

Le raccolte geospaziali generalmente implicano l'archiviazione di GeoJSON nel database Mongo, lo streaming di tali dati al client, l'accesso alla window.navigator.geolocation del window.navigator.geolocation , il caricamento di un'API di mappa, la conversione di GeoJSON in LatLng e il tracciamento sulla mappa. Preferibilmente tutto in tempo reale. Ecco un elenco di risorse per iniziare:

Controllo delle query di raccolta

L'esempio seguente registrerà tutte le query della raccolta sulla console del server in tempo reale.

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);      
    }       
  }     
);      

Osservatori e funzioni del lavoratore

Se il loop di eventi del nodo agisce come una catena di biciclette, l'osservatore della raccolta sul lato server è come un deragliatore. È un meccanismo di ingranaggi che si accosterà alla raccolta dei dati quando i dati arriveranno. Può essere molto performante, poiché tutte le biciclette da corsa hanno deragliatori. Ma è anche una fonte per rompere l'intero sistema. È una funzione reattiva ad alta velocità, che può far saltare in aria te. Essere avvertito

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.");
    }
  });
});

Notare che il limite di 20 è la dimensione del deragliatore .... quanti denti ha; o, più precisamente, quanti oggetti sono nel cursore mentre cammina sopra la collezione. Fai attenzione all'utilizzo della parola chiave 'var' in questo tipo di funzione. Scrivi meno oggetti possibile nella memoria e concentrati sul riutilizzo degli oggetti all'interno del metodo aggiunto. Quando l'opslog è attivo, e questa cosa sta andando a tutta velocità, è un candidato ideale per mostrare brutte perdite di memoria se sta scrivendo gli oggetti sull'heap della memoria più velocemente di quanto il garbage collector di Node sia in grado di pulire le cose.

La soluzione di cui sopra non scalerà orizzontalmente bene, perché ogni istanza di Meteor cercherà di aggiornare lo stesso record. Quindi, è necessaria una sorta di rilevamento dell'ambiente per farlo scalare orizzontalmente.

Vedi il percolatestudios:synced-cron package per un eccellente esempio di sincronizzazione dei service worker su più macchine in un cluster.
meteora-sincronizzati-cron



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow