У меня есть коллекция в базе данных mongo, которая добавляет некоторую информацию о типах ведения журнала. Я пытаюсь найти наиболее эффективный/простой метод для "tail -f", который в приложении meteor - по мере добавления нового документа в коллекцию он должен быть отправлен клиенту, который должен добавить его в конец текущего набора документов в коллекции.
Клиент не будет отправлен и не будет содержать все документы в коллекции, вероятно, только последние ~ 100 или около того.
Теперь, с точки зрения Монголя, я не вижу способа сказать "последние N документов в коллекции", так что нам вообще не нужно было бы применять какой-либо вид. Кажется, что лучший доступный вариант - это естественный сорт, а затем лимитный вызов, что-то вроде того, что указано в файле mongo на $natural
db.collection.find().sort( { $natural: -1 } )
Итак, на стороне сервера AFAICT способ опубликования этой коллекции "Метеор последних 100 документов" будет выглядеть примерно так:
Meteor.publish('logmessages', function () {
return LogMessages.find({}, { sort: { $natural: -1 }, limit: 100 });
});
Теперь, с точки зрения "хвост -f", это похоже на правильный эффект отправки "последних 100 документов" на сервер, но делает это в неправильном порядке (самый новый документ будет в начале Коллекция Метеор, а не в конце).
На стороне клиента это означает, что нужно (к сожалению) обратить вспять коллекцию. Теперь я не вижу обратного() в документах Meteor Collection и сортировки по $natural: 1 не работает на клиенте (что кажется разумным, поскольку нет реального монгольского контекста). В некоторых случаях сообщения будут иметь отметки времени в документах, и клиент может сортировать их, чтобы вернуть "естественный порядок", но это похоже на хакерство.
В любом случае, похоже, что я, скорее всего, пропустил гораздо более простой способ, чтобы "последние 100 документов, вставленных в коллекцию", опубликованные из монго через метеор.:)
Спасибо!
EDIT - похоже, если я изменю коллекцию в Mongo на ограниченную коллекцию, тогда сервер сможет создать верный курсор для эффективного (и быстро) получать уведомления о новых документах, добавленных в коллекцию. Однако мне не ясно, если/как заставить сервер сделать это через коллекцию Meteor.
Альтернатива, которая кажется немного менее эффективной, но не требует перехода на ограниченную коллекцию (AFAICT), использует Smart Collections, которая делает хвостовое оперение так, чтобы в меньшей степени это событие, управляемое событиями, а не опрос, и поскольку все операции в исходной коллекции будут вставками, похоже, что это все равно будет довольно эффективно. К сожалению, AFAICT у меня все еще остались проблемы с сортировкой, так как я не вижу, как определить сборку на стороне сервера как "последние 100 вставленных документов".: (
Если есть способ создания коллекции в Mongo как запрос другого ( "материализованный вид" ), возможно, я мог бы создать "коллекционный вид" в журнале "last-100" в Mongo, а затем Meteor уметь просто публиковать/подписывать всю псевдосборку?