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

mix*_*mix 14 firebase

我正在制作一个简单的应用程序,通知客户其他客户点击了一个按钮.我db使用以下方法将点击存储在Firebase()中:

db.push({msg:data});
Run Code Online (Sandbox Code Playgroud)

所有客户都会收到其他用户的点击通知on,例如

db.on('child_added',function(snapshot) { 
  var msg = snapshot.val().msg; 
});
Run Code Online (Sandbox Code Playgroud)

但是,当页面首次加载时,我想丢弃堆栈中的任何现有数据.我的策略是db.once()在定义之前调用db.on('child_added',...)以获取初始数量的子节点,然后使用它来丢弃该调用的数量db.on('child_added',...).

不幸的是,所有对db.on('child_added',...)的调用都是我能够获得初始计数之前发生的,所以它失败了.

我怎样才能有效而简单地丢弃初始数据?

Kat*_*ato 25

对于较大的数据集,Firebase现在提供(从2.0开始)一些可以使这更简单的查询方法.

如果我们在每条记录上添加一个时间戳字段,我们可以构造一个只查看新值的查询.考虑这个人为的数据:

{
  "messages": {
     "$messageid": {
        "sender": "kato",
        "message": "hello world"
        "created": 123456  // Firebase.ServerValue.TIMESTAMP
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

我们只能在"now"之后使用以下内容找到消息:

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());
});
Run Code Online (Sandbox Code Playgroud)

  • 使用Firebase.ServerValue.TIMESTAMP,不会有任何不一致.如果你担心有人黑客软件设置不一致的时间 - 他们真的很无聊 - 然后使用安全规则来强制执行时间戳的一致性. (3认同)

Rob*_*rco 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;
});
Run Code Online (Sandbox Code Playgroud)

此方法的替代方法是编写具有优先级的新项目,其中优先级是Firebase.ServerValue.TIMESTAMP(当前服务器时间),然后使用.startAt(...)当前时间戳的查询.然而,这比上述方法更复杂.