Child_added订阅似乎下载整个数据集

我有一个很大的数据集(~100K条目),这是订阅使用“child_added”事件。 使用节点7和firebase 3.6.1,这样做似乎下载了一个child_added事件之前,整个10万条目。

内存消耗显着增长了几十秒,然后所有child_added事件都迅速发生。

这很慢:

require('firebase'). initializeApp({databaseURL: 'https://someproject.firebaseio.com'}). database().ref('data'). on('child_added', (snap) => console.log(snap.key)); 

限制仍然很快(延迟几秒钟):

 require('firebase'). initializeApp({databaseURL: 'https://someproject.firebaseio.com'}). database().ref('data').limitToFirst(10). on('child_added', (snap) => console.log(snap.key)); 

鉴于Firebase的stream媒体性质,我认为在完成任何事情之前,并不打算将child_added订阅的行为下载到客户端。

我做错了什么,或者这是一个错误?

虽然从firebase 文档中提取的child_added部分中提到:

child_added事件通常用于从数据库中检索项目列表。 与返回位置的全部内容的值不同,为每个现有的子项触发一次child_added,然后每次将新的子项添加到指定的path时触发一次。 事件callback传递一个包含新的孩子数据的快照。 为了sorting目的,还传递了包含前一个子项的第二个参数。

在该页面的第一行 ,我们可以find这个:

存储在Firebase实时数据库中的数据通过将asynchronous侦听器附加到数据库引用来检索。 对于数据的初始状态,监听器将被触发一次,并且在任何时候数据改变。

似乎是它的正常行为。 它首先检索所有的数据。

我处于同样的情况,等待将近40秒,让第一个孩子开枪。 我能想出的唯一解决scheme是使用Firebase rest API和浅查询参数获取密钥,然后遍历每个密钥并调用Firebase。 这基本上是我做的。

 ` console.log('start', Date.now()); fetch('https://[firebase_app].firebaseio.com/[your_path].json?shallow=true') .then((response) => { return response.json(); }).then(function(j) { Object.keys(j).forEach(function (key) { console.log(key, 'start', Date.now()); firebase_reference.child(key).on("child_added", function (snapshot) { console.log(key, Date.now()); //now you have the first response without waiting for everything. }); }); });` 

我知道这不会回答你有关child_addedfunction的问题,但是它确实会像child_added一样发生。 我将向Firebase提交function请求并链接此SO问题。