Firebase实时数据库数据快照之间的差异



如果我有一个像这里这样的数据库结构,我会进行如下所示的查询。如果我使用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. 设置侦听器以接收数据更改事件

流量取决于我们的使用情况。当您的数据不需要实时更新时,您只需调用一个方法即可获取数据(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

最新更新