如何丢弃Firebase数据库中的初始数据

时间:2013-11-09 22:14:08

标签: 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',...)的调用都发生在之前我能够获得初始计数,所以它失败了。

如何有效而简单地丢弃初始数据?

2 个答案:

答案 0 :(得分:25)

对于较大的数据集,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());
});

答案 1 :(得分:15)

如果我正确理解您的问题,听起来您想要自用户访问该页面后添加的数据。在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(...)查询时间戳。但是,这比上述方法更复杂。