Удалите доставленные сообщения из памяти Meteor Minimongo

Я пытаюсь просто создать простой чат-сервер. На данный момент основная задача - отправить сообщение от одного клиента другому клиенту без сохранения в БД, потребляя меньше памяти.
я использую Meteor 1.4.1, Пока что я могу отправлять и получать сообщения с помощью сервиса загрузки данных pub-sub.

// Collection declaration

if(Meteor.isServer){
  export const Messages = new Meteor.Collection("messages",{connection: null});
}

// Publish function

Meteor.publish('messages', function(rid) {
   if (!this.userId) {
    return this.ready();
  }

  let finderHandle = Messages.find({
    $or: [
      {username: Meteor.users.findOne({_id: this.userId}).username},
      {rid: Meteor.users.findOne({_id: this.userId}).username}
    ]
  })

  finderHandle.observeChanges({
    added: (_id, record) => {
      this.added( 'messages',_id, record )
    },
    changed: (_id, record) => {
      this.changed( 'messages', _id, record)
    },
    removed: (_id, record) => {
     this.removed( 'messages',_id, record)
    }
  });

  this.onStop(() => {
    console.log("disconnected")
    // finderHandle.close(); // Giving an Error: finderHandle.close() function not found.
  })
  this.ready();
});

Проблема здесь в том, что он хранит все сообщения в памяти. Он должен работать только как посредник. Когда один клиент подписывается, он должен доставить сообщение, а после этого он должен быть освобожден из памяти. В настоящее время при подписке я также получаю все предыдущие сообщения.

То, что мне здесь не хватает, это onStop функция, я не уверен, как это может быть достигнуто. Пожалуйста, укажите мне в правильном направлении.

Спасибо заранее, комментарии также будут оценены.

ОБНОВИТЬ

из @CodeChimp я обновил запрос к коллекции, как показано ниже:

return Messages.find({
  rid: Meteor.users.findOne({_id: this.userId}).username,
  ls: {$exists: false}
},{
 sort: {ts: -1}
})

где rid имя пользователя получателя, и ls последний раз видели, если он не существует, только те записи будут отправлены только получателю клиента.

1 ответ

Вы пытаетесь заставить паб / саб Метеор работать так, чтобы он не работал. Когда вы создаете подписку, Meteor из коробки создаст мини-монго-базу данных для хранения информации о подписке. Добавления, отправленные из публикации, будут добавлены ко всем подписанным клиентам, изменения будут применены ко всем подписанным клиентам, а удаления будут удалены со всех подписанных клиентов.

Я думаю, что вам нужно следить за датой последнего сообщения для каждого пользователя. Тогда ваша пользовательская публикация может пропустить те, которые старше этой даты. После отправки сообщения через вашу публикацию обновите дату последнего сообщения для этого пользователя.

Другие вопросы по тегам