2012-04-11 10 views

Antwort

2

Aus der Dokumentation:

  • Auf dem Server, eine Sammlung mit diesem Namen auf einem Back-End-Mongo-Server erstellt. Wenn Sie Methoden für diese Sammlung auf dem Server aufrufen, werden sie direkt in normale Mongo-Operationen übersetzt.

  • Auf dem Client wird eine Minimongo-Instanz erstellt. Minimongo ist im Wesentlichen eine In-Memory-, nicht-persistente Implementierung von Mongo in reinem JavaScript. Es dient als lokaler Cache, der nur die Untergruppe der Datenbank speichert, mit der dieser Client arbeitet. Abfragen auf der Client (find) werden direkt aus diesem Cache bedient, ohne mit dem Server zu sprechen.

Wenn Sie auf die Datenbank auf dem Client schreiben (Einfügen, Aktualisieren entfernen), den Befehl ausgeführt wird sofort auf dem Client und gleichzeitig, es an den Server ausgeliefert und dort auch ausgeführt. Das Livedata-Paket ist dafür verantwortlich.

Das Client zum Server von

Server zum Client erklärt, was kann ich sammeln sind die live und Mongo-live Pakete.

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

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

Hoffnung, das hilft.

+0

Eine Sache, die ich nicht getestet habe, ist, ob Inserts in MongoDB-Sammlungen * außerhalb * von Meteor an Clients weitergegeben werden. – fadedbee

+0

Ich habe den Code überflogen, aber ich kann die Zeile nicht sehen, in der Meteor von MongoDB über Aktualisierungen von Sammlungen informiert wird. – fadedbee

+3

@chrisdew Ich habe gerade einen Datensatz direkt in MongoDB eingefügt und er erschien im Browser. Also ich denke der Server wird benachrichtigt. –

19

Sie möchten query.observe() für diese. Angenommen, Sie haben eine Posts Sammlung mit einem Tag-Feld und möchten benachrichtigt werden, wenn ein Beitrag mit dem Tag important hinzugefügt wird.

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

Sie können auf dem Client diesen Code ausführen, wenn Sie etwas in jedem Browser, wenn ein Beitrag Änderungen machen wollen. Oder Sie können dies auf dem Server ausführen, wenn Sie eine E-Mail an das Team senden möchten, wenn ein wichtiger Beitrag hinzugefügt wird.

Beachten Sie, dass sich added und removed auf die Abfrage beziehen, nicht auf das Dokument. Wenn Sie ein vorhandenes Dokument Post haben, und führen Sie

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

dies den ‚hinzugefügt‘ Rückruf auslösen, da die Post an das Abfrageergebnis hinzugefügt zu werden.

+7

Dies ist eine sehr gute Antwort, aber nicht auf diese Frage. Ich fragte, wie Meteor den Strom von Änderungen von MongoDB bekommt und nicht, wie man die Änderungen von Meteor bekommt. – fadedbee

3

Momentan funktioniert Meteor wirklich gut mit einer Instanz/Prozess. In diesem Fall durchlaufen alle Abfragen diese Instanz und können sie an andere Clients zurücksenden. Außerdem fragt MongoDB alle 10s nach Änderungen an der Datenbank ab, die von externen Abfragen ausgeführt wurden. Sie sind für 1.0 geplant, um die Skalierbarkeit zu verbessern und hoffentlich mehreren Instanzen zu ermöglichen, jede über Änderungen zu informieren.

DerbyJS auf der anderen Seite verwendet Redis PubSub.