2012-04-11 7 views

risposta

2

Dalla documentazione:

  • Sul server, un album con questo nome viene creato su un server di backend Mongo. Quando chiami metodi su quella raccolta sul server, si traducono direttamente nelle normali operazioni di Mongo.

  • Sul client, viene creata un'istanza Minimongo. Minimongo è essenzialmente un'implementazione in-memory, non persistente di Mongo nel puro JavaScript . Funziona come una cache locale che memorizza solo il sottoinsieme del database con cui sta lavorando questo client. Le domande su il client (trova) vengono servite direttamente da questa cache, senza parlando al server.

Quando si scrive al database sul client (inserimento, aggiornamento, rimuovere), il comando viene eseguito immediatamente sul client, e, contemporaneamente, è spedito al server ed eseguito anche lì. Il pacchetto livedata è responsabile di ciò.

che spiega client al server

server al client da quello che ho potuto capire è i pacchetti LiveData e Mongo-LiveData.

https://github.com/meteor/meteor/tree/master/packages/mongo-livedata

https://github.com/meteor/meteor/tree/master/packages/livedata

Speranza che aiuta.

+0

Una cosa che non ho testato è se gli inserimenti nelle raccolte MongoDB eseguite * all'esterno * di Meteor vengono propagati ai client. – fadedbee

+0

Ho sfogliato il codice, ma non riesco a vedere la linea in cui Meteor è stata informata da MongoDB degli aggiornamenti alle raccolte. – fadedbee

+3

@chrisdew Ho appena inserito un record direttamente in MongoDB ed è apparso nel browser. Quindi immagino che il server venga avvisato. –

19

Si desidera query.observe() per questo. Supponiamo che tu abbia una collezione Posts con un campo tag e che tu debba ricevere una notifica quando viene aggiunto un post con il tag important.

http://docs.meteor.com/#observe

// collection of posts that includes array of tags 
var Posts = new Meteor.Collection('posts'); 

// DB cursor to find all posts with 'important' in the tags array. 
var cursor = Posts.find({tags: 'important'}); 

// watch the cursor for changes 
var handle = cursor.observe({ 
    added: function (post) { ... }, // run when post is added 
    changed: function (post) { ... } // run when post is changed 
    removed: function (post) { ... } // run when post is removed 
}); 

È possibile eseguire il codice sul client, se si vuole fare qualcosa in ogni browser quando un post cambiamenti. Oppure puoi eseguirlo sul server, se vuoi dire invia una mail al team quando viene aggiunto un post importante.

Nota che added e removed si riferiscono alla query, non al documento. Se si dispone di un documento post esistente e si esegue

Posts.update(my_post_id, {$addToSet: {tags: 'important'}}); 

questo farà scattare il callback 'aggiunto', dal momento che il post è sempre aggiunto il risultato della query.

+7

Questa è una risposta molto buona, ma non a questa domanda. Stavo chiedendo come Meteor ottiene il flusso di modifiche da MongoDB, non come ottenere i cambiamenti da Meteor. – fadedbee

3

Attualmente, Meteor funziona davvero bene con un'istanza/processo. In tal caso, tutte le query passano attraverso questa istanza e possono trasmetterle ad altri client. Inoltre, esegue il polling di MongoDB ogni 10 secondi per le modifiche al database eseguite da query esterne. Sono piani per 1.0 per migliorare la scalabilità e, auspicabilmente, consentire a più istanze di informare ciascuno dei cambiamenti.

DerbyJS d'altra parte utilizza Redis PubSub.