使用Firebase侦听嵌套更改的正确方法是什么?
我试图通过使用火力地堡,Twilio和Node.js的浏览器发送短信在火力地堡我目前的数据结构是这样的:
{ messages :
{ +15553485 :
{ FB-GENERATED-KEY-1 :
{ body: "hello world"
timestamp: 1461758765472 }
},
{ FB-GENERATED-KEY-3 :
{ body: "I love dogs"
timestamp: 1461758765475 }
}
}
},
{ +15550000 :
{ FB-GENERATED-KEY-2 :
{ body: "goodbye world"
timestamp: 1461758765473 }
},
{ FB-GENERATED-KEY-4 :
{ body: "I love cats"
timestamp: 1461758765476 }
}
}
}
}
当消息通过后端需求,以便通过Twilio发送短信得到通知的前端添加到火力地堡。当后端从手机获得回复时(通过Twilio),它将其添加到Firebase。
当我听到更改到我接收到发送/所有邮件收到该电话号码的线程:
问题。很明显,后端不想再发送所有的消息,所以我只对添加到线程中的最新消息感兴趣。
此外,我似乎无法轻松获得在其下面有消息的电话号码(密钥)。
我已经试过什么:
ref.child('messages').on('child_added', ...)
- 这适用于已在/messages
添加新的电话号码,但是火力地堡不通过新的电话号码发送(密钥),只有从FB-GENERATED-KEY-2
下来的一切。
ref.child('messages').on('child_changed', ...)
- 这将返回全部消息在一个线程中,不仅是新的。我可以在服务器上排序并找到最近的消息,但是好像它会很快变得沉重 - 如果您发送了数以千计的消息,该怎么办?
在根级别存储消息(也就是扁平化树)并将该数字存储为属性可以工作,但我需要使用电话号码作为索引来与其他数据连接后来(如外键)。
问题:
- 我怎么能只听活动父
/messages
,而不是一个特定的电话号码时,你得到的最新消息? - 如何在使用
child_
事件时获得密钥(电话号码)? - 这个数据结构是否有意义?
您可以通过调用你的听众child_added
返回快照key()
得到火力地堡的关键。
然后你就可以添加其他嵌套的监听器是这样的:
ref.child('messages').on('child_added', function (snapshot) {
var phone = snapshot.key();
ref.child('messages').child(phone).on('child_added', function (message) {
//send SMS
}, function (error) {
});
}, function (error) {
});
的火力地堡API允许你监听价值变动或对儿童操作。它没有办法倾听grand孩子的变化。
在NoSQL数据库中,您经常需要根据应用程序的使用方式对数据建模。如果我看一下您的具体使用案例:
当通过前端将消息添加到Firebase时,后端需要得到通知才能通过Twilio发送SMS。
我在这里看到的队列:
smsQueue: {
pushId1: {
number: "+15553485",
body: "hello world",
timestamp: 1461758765472
},
pushId2: {
number: "+15550000",
body: "goodbye world",
timestamp: 1461758765473
},
pushId3: {
number: "+15553485",
body: "I love dogs",
timestamp: 1461758765475
},
pushId4: {
number: "+15550000",
body: "I love cats",
timestamp: 1461758765476
}
}
采用这种结构后端(其希望使用firebase-queue)可以采取每个任务从队列中,调用twilio并从队列中删除的项目。
感谢您的答案! 'firebase-queue'看起来很有趣,我会检查一下。但是我确实想将这些消息保存在数据库中,所以它不是您列出的队列用例。 –
啊!当然,'snapshot.val()'给你的值和'snapshot.key()'给你的关键是有道理的!当新消息添加新号码时,您的答案应该能够很好地工作,但是如何为现有号码添加新消息?我是否使用嵌套的侦听器做类似的事情,但使用'child_changed'事件呢? –
@BenjaminHumphrey你的意思是你已经有一个现有的数据集,当你实现这个?在这种情况下,我可能会在外部侦听器中用'once('value')'做类似的事情。对于新号码,内部监听者将监听所有未来的新消息。 – kolli
不,我的意思是当新消息发送到数据库中已存在的号码时。 'child_added'事件不会触发顶层,因为没有添加新的数字,只有一个新的消息被添加为孙子。不过,我一直在阅读更多关于在Firebase中构建数据的信息,而且听起来我应该将所有内容都进一步扁平化,因此/信息和/数字都处于根级别。请参阅[构建数据](https://www.firebase.com/docs/web/guide/structuring-data.html)。 –