Firebase chat - удаление старых сообщений

У меня есть чат с 1 комнатой, личными сообщениями, модерацией и всем остальным, и все это прекрасно работает! Пока я тестировал чат, я понял, что все сообщения, набранные в чате, были сохранены, и, если в чате было много людей, это очень быстро заняло бы довольно много места в вашей Firebase.

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

Когда Джон отправляет личное сообщение Бобу, оно будет добавлено в список личных сообщений Джона и Бобса, например:

/private/John <-- Message appended here
/private/Bob <-- Message appended here

Это пример того, как firebase будет выглядеть с 2 сообщениями в чате и 2 личными сообщениями:

{
  "chat" : {
    "516993ddeea4f" : {
      "string" : "Some message here",
      "time" : "Sat 13th - 18:20:29",
      "username" : "test",
    },
    "516993e241d1c" : {
      "string" : "another message here",
      "time" : "Sat 13th - 18:20:34",
      "username" : "Test2",
    }
  },
  "private" : {
    "test" : {
      "516993f1dff57" : {
        "string" : "Test PM reply!",
        "time" : "Sat 13th - 18:20:49",
        "username" : "Test2",
      },
      "516993eb4ec59" : {
        "string" : "Test private message!",
        "time" : "Sat 13th - 18:20:43",
        "username" : "test",
      }
    },
    "Test2" : {
      "516993f26dbe4" : {
        "string" : "Test PM reply!",
        "time" : "Sat 13th - 18:20:50",
        "username" : "Test2",
      },
      "516993eab8a55" : {
        "string" : "Test private message!",
        "time" : "Sat 13th - 18:20:42",
        "username" : "test",
      }
    }
  }
}

и то же самое происходит наоборот. Теперь, если Бобу нужно отключиться, список личных сообщений Бобса удаляется, но Джон все еще может видеть его разговор с Бобом, потому что он получил копию всех сообщений в своем списке. Если Джон затем отключится после Боба, Firebase будет очищен, и их разговор больше не будет сохранен.

Есть ли способ добиться чего-то подобного с помощью общего чата? Отправка сообщения всем пользователям, использующим чат, не кажется хорошим решением (?). Или можно, например, заставить Firebase хранить только последние 100 сообщений?

Я надеюсь, что это имеет смысл!

С уважением

Ps. Большое спасибо команде Firebase за всю помощь, я очень ценю это.

1 ответ

Решение

Есть несколько различных способов решения этой проблемы, некоторые из которых более сложны для реализации, чем другие. Самое простое решение - каждый пользователь прочитал бы только последние 100 сообщений:

var messagesRef = new Firebase("https://<example>.firebaseio.com/message").limit(100);
messagesRef.on("child_added", function(snap) {
  // render new chat message.
});
messagesRef.on("child_removed", function(snap) {
  // optionally remove this chat message from DOM
  // if you only want last 100 messages displayed.
});

Ваш список сообщений будет по-прежнему содержать все сообщения, но это не повлияет на производительность, поскольку каждый клиент запрашивает только последние 100 сообщений. Кроме того, если вы хотите очистить старые данные, лучше всего установить приоритет для каждого сообщения как метку времени, когда сообщение было отправлено. Затем вы удаляете все сообщения старше 2 дней с помощью:

var timestamp = new Date();
timestamp.setDate(timestamp.getDate()-2);
messagesRef.endAt(timestamp).on("child_added", function(snap) {
  snap.ref().remove();
}); 

Надеюсь это поможет!

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