Как отбрасывать исходные данные в базе данных Firebase

Я делаю простое приложение, которое информирует клиента о том, что другие клиенты нажали кнопку. Я сохраняю клики в Firebase (db), используя:

db.push({msg:data});

Все клиенты получают уведомления о других кликах пользователей с помощью on, например

db.on('child_added',function(snapshot) { 
  var msg = snapshot.val().msg; 
});

Однако, когда первая страница загружается, я хочу отбросить любые существующие данные в стеке. Моя стратегия состоит в вызове db.once(), прежде чем я определяю db.on('child_added',...), чтобы получить начальное число дочерних элементов, а затем использовать это, чтобы отменить это число вызовов db.on('child_added',...).

К сожалению, все вызовы db.on('child_added',...) происходят до того, как я смогу получить начальный счет, поэтому он терпит неудачу.

Как я могу эффективно и просто отказаться от исходных данных?

Ответ 1

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

Однако, если вы хотите отображать данные, добавленные после загрузки страницы, попробуйте игнорировать все события до того, как полный набор детей загрузится хотя бы один раз. Например:

var ignoreItems = true;
var ref = new Firebase('https://<your-Firebase>.firebaseio.com');
ref.on('child_added', function(snapshot) {
  if (!ignoreItems) {
    var msg = snapshot.val().msg;
    // do something here
  }
});
ref.once('value', function(snapshot) {
  ignoreItems = false;
});

Альтернативой этому подходу было бы записать ваши новые элементы с приоритетом, где приоритет Firebase.ServerValue.TIMESTAMP (текущее время сервера), а затем использовать запрос .startAt(...), используя текущую временную метку. Однако это сложнее, чем описанный выше подход.

Ответ 2

Для больших наборов данных Firebase теперь предлагает (с 2.0) некоторые методы запросов, которые могут сделать это проще.

Если мы добавим поле метки времени для каждой записи, мы можем построить запрос, который будет рассматривать только новые значения. Рассмотрим эти надуманные данные:

{
  "messages": {
     "$messageid": {
        "sender": "kato",
        "message": "hello world"
        "created": 123456  // Firebase.ServerValue.TIMESTAMP
     }
  }
}

Мы могли бы найти сообщения только после "сейчас", используя что-то вроде этого:

var ref = new Firebase('https://<your instance>.firebaseio.com/messages');

var queryRef = ref.orderBy('created').startAt(Firebase.ServerValue.TIMESTAMP);

queryRef.on('child_added', function(snap) {
  console.log(snap.val());
});