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问题。
- 无法执行Firebase部署 – 错误:指定的Firebase无效
- 通知不会出现在应用程序的背景状态和死亡状态
- 当我的Node.js应用程序处于脱机状态时,是否应将Firebase数据库设置为脱机?
- 在承诺触发之前,Firebase正在等待加载数据库数据
- Firebase child.once在auth.signInWithEmailAndPasswordcallback中超时不一致
- 我可以在客户端和Firebase之间使用自己的NodeJS服务器,并仍然使用“on()”方法吗?
- 在Firestore(NodeJS)文档中设置DocumentReference
- 将Firestore依赖项和types导入到node.js
- 如何在firebase的云端函数中读取单个请求中多个用户ID的数据