2015-07-30 6 views
3

Я пытаюсь использовать Mongoose и его querystream в приложении для планирования, но, возможно, я не понимаю, как это работает. Я прочитал этот вопрос здесь на SO [Mongoose QueryStream new results и, кажется, я правильно, но кто-то пожалуйста, объясните:MongoDb + Mongoose QueryStream - После внесения изменений в документ

Если я фильтровать запрос как так -

Model.find().stream() 

, когда я добавить или изменить что-то, что соответствует .find(), оно должно выбросить событие data, правильно? Или я совершенно не прав в своем понимании этой проблемы?

Например, я пытаюсь взглянуть на некоторых данных, как так:

Events.find({'title':/^word/}).stream(); 

Я меняю название в консоли MongoDB, и не видя никаких изменений.

Может ли кто-нибудь объяснить, почему?

ответ

2

Ваше понимание действительно неверно, поскольку поток является только потоком вывода текущего запроса ответа, а не тем, что «слушает новые данные» сам по себе. Возвращаемый результат здесь в основном представляет собой только узел streaming interface, который является необязательным выбором в отличие от «курсора» или, действительно, прямого перевода в массив по методам mongoose по умолчанию.

Таким образом, «поток» не просто «следит» за чем угодно. Это просто другой способ справиться с обычными результатами запроса, но таким образом, который не «скорбит» все результаты в память сразу. Он скорее использует прослушиватели событий для обработки каждого результата, так как он извлекается из курсора сервера.

Что вы на самом деле говорите, это "tailable cursor" или их вариант. В основных операциях MongoDB «хвостовой курсор» может быть реализован на capped collection. Это особый тип сбора с определенными правилами, поэтому он может не соответствовать вашим целям. Они предназначены для операций «вставить», которые обычно подходят для очередей событий.

На модели, которая использует колпачок коллекцию (и только там, где ограничен сбор был установлен), то вы реализуете так:

var query = Events.find({'title':/^word/}).sort({ "$natural": -1}).limit(1); 
var stream = query.tailable({ "awaitdata": true}).stream(); 

// fires on data received 
stream.on("data",function(data) { 
    console.log(data); 
}); 

The «awaitdata» есть только в качестве важного ОПЦИИ «tailable» option, поскольку это главное, что говорит курсору запроса, чтобы он оставался «активным» и «хвостовым» дополнением к коллекции, удовлетворяющей условиям запроса. Но для этой работы ваша коллекция должна быть «ограничена».

Альтернативный и более удобный подход к этому - это сделать что-то вроде распределения meteor, где «закрытая коллекция», которая является хвостом, на самом деле является MongoDB oplog. Для этого требуется конфигурация replica set, однако, как только метеор выходит из строя, нет ничего плохого в том, что один узел как набор реплик сам по себе. Это просто неразумно делать это на производстве.

Это более удобно, чем простой ответ, но основная концепция заключается в том, что «oplog» - это ограниченная коллекция, которую вы можете «загнать» ее для всех операций записи в базе данных. Затем данные этого события проверяются для определения таких деталей, в которые была записана коллекция, которую вы хотите наблюдать за записью. Затем эти данные могут использоваться для запроса новой информации и делать что-то вроде возврата обновленных или новых результатов клиенту через веб-узел или подобное.

Но поток сам по себе является потоком. Чтобы «следить» за изменениями в коллекции, вам нужно либо реализовать ее как ограниченную, либо рассмотреть возможность внедрения процесса, основанного на просмотре изменений в oplog, как описано.

+0

спасибо. Это действительно фантастическое объяснение. Я уже установил его как ограниченную коллекцию, поэтому мне придется исследовать дальше. В любом случае, я предполагаю, что это будет означать, что если я буду искать что-то вроде, скажем, временной метки, оно вернет результаты только для вещей, вставленных после того, как я выполнил это .find, правильно? Он не будет опросить, чтобы продолжать проверку? – afithings

+0

@afithings При первом выполнении запроса (опрошен слушателем события) будут возвращены все результаты, соответствующие условиям. Я просто прошу «limit (1)» в примере, поскольку вы обычно просто хотите следовать. После этого, поскольку курсор на сервере остается открытым, все возвращаемые данные возвращаются. Это не будет отслеживать «изменения» документа, кроме вставки. Для этого вам нужно посмотреть на oplog. Как правило, просто новые вставки после прослушивания. –

+0

Отлично. Я ценю хорошие объяснения. Спасибо! – afithings

Смежные вопросы