Kiedy „chcesz poinformować serwer, że kolekcja jest statyczna”, zdaję sobie sprawę z dwóch potencjalnych optymalizacje:
- Nie obserwować bazy danych za pomocą rekordów na żywo, ponieważ dane nie zmienią
- nie przechowywać wyniki tej kwerendy w merge box ponieważ nie muszą być śledzone i porównane z innymi danymi (oszczędność pamięci i CPU)
(1) jest czymś, co można zrobić dość łatwo przez skonstruowanie własnego kursora publikowania. Jednakże, jeśli klient obserwuje to samo zapytanie, wierzę, że Meteor (przynajmniej w przyszłości) zoptymalizuje go, dlatego wciąż jest to jedno aktywne zapytanie dla dowolnej liczby klientów. Jeśli chodzi o (2), nie jestem świadomy żadnego prostego sposobu, aby to zrobić, ponieważ może to zepsuć łączenie danych ponad multiple publications and subscriptions.
Aby uniknąć użycia zapytania na żywo, można ręcznie dodać dane do funkcji publikowania zamiast zwracać kursor, co powoduje wywołanie funkcji .observe()
w celu podłączenia danych do subskrypcji. Oto prosty przykład:
Meteor.publish(function() {
var sub = this;
var args = {}; // what you're find()ing
Foo.find(args).forEach(function(document) {
sub.added("client_collection_name", document._id, document);
});
sub.ready();
});
To spowoduje, że dane mają być dodane do client_collection_name
po stronie klienta, które mogłyby mieć taką samą nazwę jak kolekcji odwołuje Foo
, czy coś innego. Należy pamiętać, że można zrobić many other things with publications
aktualizację (również patrz powyższy link.): Aby rozwiązać problemy z (2), które mogą być potencjalnie bardzo problematyczne w zależności od wielkości zbiorów, konieczne jest obejście Meteor w ogóle. Zobacz https://stackoverflow.com/a/21835534/586086, aby uzyskać jeden sposób. Innym sposobem jest po prostu zwrócić kolekcję fetch()
ed jako wywołanie metody, choć nie ma to zalet kompresji.
ta powinna być przyjęta odpowiedź aż 2 może zostać rozwiązany. Dzięki Andrew –
@WesJohnson zobacz http://stackoverflow.com/a/21835534/586086, jak rozwiązać # 2. Również zaktualizuję tę odpowiedź w pewnym momencie. –