如果我有一个像这里这样的数据库结构,我会进行如下所示的查询。如果我使用snapshot.forEach(function(childSnapshot)
访问每个节点,以及如果我不访问节点,那么从数据库下载快照所使用的流量是否存在差异?
如果没有区别,是否有一种方法可以只访问Chats
中的密钥,而不获取每个密钥包含的快照数据。我假设通过这种方式,它将生成更少的下载数据
var requests = db.ref("Chats");
requests.on('child_added', function(snapshot) {
var communicationId = snapshot.key;
console.log("Chat id = " + communicationId);
getMessageInfo(
communicationId,
function() {
snapshot.ref.remove();
}
);
当您调用requests.on('child_added', ...)
时,您总是要访问requests
节点上的所有数据。在回调函数中做什么并不重要。整个节点被加载到内存中,并支付查询的费用。您对内存中的快照所做的操作不需要任何其他成本。
如果您不希望requests
下的所有子节点,您应该找到一些方法来过滤查询,只查找您需要的子节点。
正如文档中提到的,可以使用以下任一方法:
- 调用一个方法来获取数据
- 设置侦听器以接收数据更改事件
流量取决于我们的使用情况。当您的数据不需要实时更新时,您只需调用一个方法即可获取数据(1(
但如果您希望数据实时更新,则应选择的(2(。当您设置侦听器时,Firebase会向侦听器发送数据的初始快照,然后在每次子项更改时发送另一个快照。
(1(-示例
firebase.database().ref('/users/').once('value') // Single Call
(2(-示例
firebase.database().ref('/users/').on('child_added') // Every Update It is Called
此外,我认为您不能获得所有的键,因为当您引用一个子项并检索数据时,firebase本身会将其作为键值对(DataSnapshot(发送。
进一步参考:
https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot
https://firebase.google.com/docs/database/web/read-and-write