2012-04-11 10 views

Respuesta

2

A partir de los documentos:

  • En el servidor, una colección con este nombre se crea en el servidor back-end Mongo. Cuando llama métodos a esa colección en el servidor, se traducen directamente en operaciones normales de Mongo.

  • En el cliente, se crea una instancia de Minimongo. Minimongo es esencialmente una implementación in-memory, no persistente de Mongo en JavaScript puro. Sirve como un caché local que almacena solo el subconjunto de la base de datos con la que está trabajando este cliente. Las consultas en el cliente (buscar) se sirven directamente desde este caché, sin hablando con el servidor.

Al escribir en la base de datos en el cliente (insertar, actualizar, eliminar), el comando se ejecuta inmediatamente en el cliente, y, al mismo tiempo, de su envío hasta el servidor y ejecutado allí también. El paquete livedata es responsable de esto.

Eso explica el cliente al servidor

del servidor al cliente a partir de lo que he entendido es los paquetes LiveData y mongo-LiveData.

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

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

Espero que ayude.

+0

Una cosa que no he probado es si las inserciones en las colecciones de MongoDB hechas * fuera * de Meteor se propagan a los clientes. – fadedbee

+0

He robado el código, pero no puedo ver la línea donde MongoDB notifica a Meteor de las actualizaciones de las colecciones. – fadedbee

+3

@chrisdew Acabo de insertar un registro directamente a MongoDB y apareció en el navegador. Así que supongo que el servidor recibe una notificación. –

19

Quiere query.observe() para esto. Supongamos que tiene una colección Posts con un campo de etiquetas y desea recibir una notificación cuando se agrega una publicación con la etiqueta 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 
}); 

Puede ejecutar este código en el cliente, si usted quiere hacer algo en cada navegador cuando un poste de cambios. O puede ejecutar esto en el servidor, si desea enviar un correo electrónico al equipo cuando se agrega una publicación importante.

Tenga en cuenta que added y removed hacen referencia a la consulta, no al documento. Si usted tiene un documento puesto existente y ejecutar

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

esto desencadenará la devolución de llamada 'añadido', ya que el puesto se van añadiendo al resultado de la consulta.

+7

Esta es una muy buena respuesta, pero no a esta pregunta. Estaba preguntando cómo Meteor recibe la corriente de cambios de MongoDB, no cómo obtener los cambios de Meteor. – fadedbee

3

Actualmente, Meteor realmente funciona bien con una instancia/proceso. En tal caso, todas las consultas pasan por esta instancia y pueden transmitirla a otros clientes. Además, sondea MongoDB cada 10 s por cambios en la base de datos que fueron realizados por consultas externas. Son planes para 1.0 para mejorar la escalabilidad y, con suerte, permitir que varias instancias informen a cada uno sobre los cambios.

DerbyJS por otro lado está utilizando Redis PubSub.

Cuestiones relacionadas