2012-04-11 11 views

Odpowiedz

2

Od docs:

  • Na serwerze zbiór o tej nazwie jest tworzony na serwerze backend Mongo. Gdy wywołujesz metody z tej kolekcji na serwerze, , tłumaczą one bezpośrednio na normalne operacje Mongo.

  • Na kliencie tworzona jest instancja Minimongo. Minimongo to w zasadzie pamięćowa, nietrwała implementacja Mongo w czystym JavaScript. Służy jako lokalna pamięć podręczna, która przechowuje tylko podzbiór bazy danych, z którą pracuje ten klient. Zapytania na temat klienta (Znajdź) są obsługiwane bezpośrednio z tego bufora, bez rozmowę z serwerem.

Kiedy piszesz do bazy danych na kliencie (insert, update, usuń), polecenie jest wykonywane bezpośrednio na kliencie, a jednocześnie, to wysyła do serwera i wykonywane tam. Pakiet liveata jest odpowiedzialny za to.

To wyjaśnia klienta do serwera

serwera do klienta z tego co mogę zbierają się pakiety livedata i Mongo-livedata.

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

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

nadzieję, że pomoże.

+0

Jedną z rzeczy, których nie testowałem, jest to, czy wkładki w kolekcjach MongoDB są wykonywane * na zewnątrz * Meteora są propagowane do klientów. – fadedbee

+0

Przeszukałem kod, ale nie widzę linii, w której Meteor jest powiadamiany przez MongoDB o aktualizacjach kolekcji. – fadedbee

+3

@chrisdew Właśnie wstawiłem rekord prosto do MongoDB i pojawił się on w przeglądarce. Więc domyślam się, że serwer zostanie powiadomiony. –

19

Chcesz, żeby to było query.observe(). Załóżmy, że masz kolekcję Posts z polem tagów i chcesz otrzymywać powiadomienia, gdy dodany zostanie wpis ze znacznikiem 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 
}); 

Można uruchomić ten kod na kliencie, jeśli chcesz coś zrobić w każdej przeglądarce kiedy zmiany Post. Możesz też uruchomić to na serwerze, jeśli chcesz powiedzieć wysłać e-mail do zespołu, gdy zostanie dodany ważny wpis.

Należy pamiętać, że added i removed odnoszą się do zapytania, a nie do dokumentu. Jeśli masz istniejący dokument post i uruchomić

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

to wywoła „dodaną” zwrotnego, ponieważ poczta jest coraz dodany do wyniku zapytania.

+7

To jest bardzo dobra odpowiedź, ale nie na to pytanie. Pytałem, jak Meteor dostaje strumień zmian z MongoDB, a nie jak uzyskać zmiany z Meteoru. – fadedbee

3

Obecnie Meteor naprawdę działa dobrze z jedną instancją/procesem. W takim przypadku wszystkie zapytania przechodzą przez tę instancję i mogą ją przesłać z powrotem do innych klientów. Dodatkowo, ankieta MongoDB co 10s dla zmian w bazie danych, które zostały wykonane przez zapytania zewnętrzne. Są plany na 1.0, aby poprawić skalowalność i miejmy nadzieję, że wiele instancji poinformuje każdego o zmianach.

DerbyJS z drugiej strony używa Redis PubSub.

Powiązane problemy