Я задал вопрос несколько месяцев назад, на что Метеор, похоже, ответил.
Как Meteor получает обновления результатов запроса MongoDB?
Спасибо,
Крис.
Я задал вопрос несколько месяцев назад, на что Метеор, похоже, ответил.
Как Meteor получает обновления результатов запроса MongoDB?
Спасибо,
Крис.
Из документов:
На сервере коллекция с таким именем создается на сервере Mongo. Когда вы вызываете методы в этой коллекции на сервере, они переводят прямо в обычные операции Монго.
На клиенте создается экземпляр Minimongo. Minimongo по существу является встроенной памятью, непостоянной реализацией Mongo в чистый JavaScript. Он служит локальным кешем, который хранит только подмножество базы данных, с которой работает этот клиент. Запросы на клиент (find) обслуживается непосредственно из этого кеша, без разговаривая с сервером.
Когда вы пишете в базу данных на клиенте (вставляете, обновляете, удаляете) команда выполняется немедленно на клиенте и, одновременно он отправляется на сервер и выполняется там тоже. За это отвечает пакет Livingata.
Это объясняет клиент к серверу
Сервер для клиента из того, что я могу собрать, это жилые и монго-жилые пакеты.
https://github.com/meteor/meteor/tree/master/packages/mongo-livedata
https://github.com/meteor/meteor/tree/master/packages/livedata
Надеюсь, что это поможет.
Вы хотите query.observe()
для этого. Скажем, у вас есть коллекция Posts
с полем тегов, и вы хотите получать уведомление, когда добавляется сообщение с тегом 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
});
Вы можете запустить этот код на клиенте, если вы хотите что-то сделать в каждом браузере при изменении сообщения. Или вы можете запустить это на сервере, если хотите сказать, отправить сообщение в команду при добавлении важного сообщения.
Обратите внимание, что added
и removed
относятся к запросу, а не к документу. Если у вас есть существующий почтовый документ и запустите
Posts.update(my_post_id, {$addToSet: {tags: 'important'}});
это вызовет "добавленный" обратный вызов, поскольку сообщение добавляется к результату запроса.
В настоящее время Meteor действительно хорошо работает с одним экземпляром/процессом. В этом случае все запросы проходят через этот экземпляр и могут передавать его другим клиентам. Дополнительно, он опроса MongoDB каждые 10 секунд для изменений в базе данных, которые выполнялись внешними запросами. Они планируют 1.0 для улучшения масштабируемости и, надеюсь, позволяют нескольким экземплярам сообщать каждому об изменениях.
DerbyJS, с другой стороны, использует Redis PubSub.