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

Javascript Firebase实时数据库数据快照之间的差异,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,如果我有一个数据库结构,如和,我进行如下所示的查询。如果我使用snapshot.forEach(function(childSnapshot)访问每个节点,以及如果我不访问这些节点,用于从数据库下载快照的流量是否有差异 如果没有区别,是否有办法只访问Chats中的密钥,而不获取每个密钥所包含内容的快照数据。我假设这样会生成较少的下载数据 var requests = db.ref("Chats"); requests.on('child_added', functi

如果我有一个数据库结构,如和,我进行如下所示的查询。如果我使用
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();
      }
    );

如文件中所述,可使用以下任一方法:

  • 调用一个方法来获取数据
  • 设置侦听器以接收数据更改 事件
  • 流量取决于我们的使用情况。当您的数据不需要实时更新时,您可以调用一个方法来获取数据(1)
    ,但如果您希望数据实时更新,则应选择(2)。设置侦听器时,Firebase会向侦听器发送数据的初始快照,然后在每次子项更改时发送另一个快照

    (1)-示例

    firebase.database().ref('/users/').once('value') // Single Call
    
    firebase.database().ref('/users/').on('child_added') // Every Update It is Called
    
    (2)-示例

    firebase.database().ref('/users/').once('value') // Single Call
    
    firebase.database().ref('/users/').on('child_added') // Every Update It is Called
    
    而且,我认为您无法获取所有键,因为当您引用一个子项并检索数据时,firebase本身会将其作为键值对(DataSnapshot)发送

    进一步参考:


    当您调用
    requests.on('child_added',…)
    ,您总是要访问
    请求
    节点上的所有数据。无论您在回调函数中做了什么。整个节点都会加载到内存中,并且查询的成本会得到支付。您在内存中对快照所做的操作不会产生任何其他成本


    如果您不需要
    请求下的所有子节点
    ,您应该找到某种方法来筛选查询,只筛选您需要的子节点。

    非常感谢您的回答。虽然我还有一个问题,但如果我启用脱机功能,这会降低查询成本吗?如果您还有其他问题,请单独发布,解释具体情况。堆栈溢出问题应仅限于单个问题,以便将来对其他人最有帮助。