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

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

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

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

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

Это пример того, как firebase будет выглядеть с 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();
}); 

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