Подтвердить что ты не робот

Как Meteor получает обновления к результатам запроса MongoDB?

Я задал вопрос несколько месяцев назад, на что Метеор, похоже, ответил.

Какие базы данных NoSQL, если таковые имеются, могут предоставлять поток * изменений * в набор результатов запроса?

Как Meteor получает обновления результатов запроса MongoDB?

Спасибо,

Крис.

4b9b3361

Ответ 1

Из документов:

  • На сервере коллекция с таким именем создается на сервере 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

Надеюсь, что это поможет.

Ответ 2

Вы хотите 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'}});

это вызовет "добавленный" обратный вызов, поскольку сообщение добавляется к результату запроса.

Ответ 3

В настоящее время Meteor действительно хорошо работает с одним экземпляром/процессом. В этом случае все запросы проходят через этот экземпляр и могут передавать его другим клиентам. Дополнительно, он опроса MongoDB каждые 10 секунд для изменений в базе данных, которые выполнялись внешними запросами. Они планируют 1.0 для улучшения масштабируемости и, надеюсь, позволяют нескольким экземплярам сообщать каждому об изменениях.

DerbyJS, с другой стороны, использует Redis PubSub.