2016-11-23 4 views
2

「child_added」イベントを使用してサブスクライブしている大きなデータセット(〜100,000エントリ)があります。ノード7とfirebase 3.6.1を使用して、これを実行すると、child_addedイベントが1つ発生する前に100kエントリ全体をダウンロードするように見えます。Child_addedサブスクリプション全体データセットをダウンロードしているようです

メモリ消費量が数十秒で大幅に増加し、すべての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のストリーミングの性質を考えると、私はそれがchild_addedサブスクリプションのための行動を意図していないと仮定何かが行われる前に、データセット全体をクライアントにダウンロードしてください。

私は何か間違っているのですか、これはバグですか?

答えて

1

ことがfirebase documentationから抽出セクションをchild_addedが、それは言う:

がデータベースから項目のリストを取得する際イベントは一般的に使用されているchild_added。場所の内容全体を返す値とは異なり、child_addedは既存の子ごとに1回トリガされ、新しい子が指定されたパスに追加されるたびに再度トリガされます。イベントコールバックには、新しい子のデータを含むスナップショットが渡されます。順序付けの目的で、前の子のキーを含む2番目の引数も渡されます。そのページで

At the first lines

、我々はこれを見つけたことができます。Firebaseリアルタイムデータベースに保存されている

データは、データベースの参照に非同期リスナーを取り付けることにより取得されます。 リスナは、データの初期状態に対して1回トリガされ、データが変更されると再びトリガされます。

通常の動作と思われます。まず、すべてのデータを取得します。

+0

これは、child_addedイベントが発生する前に、データセット全体が最初にダウンロードされる理由を説明していません。予想される動作は、エントリがダウンロードされているか、少なくとも小規模なバッチでそれらのイベントが発生するのを見ることです。 コード例を変更しました。ありがとうございます。 – tjclement

+0

私の回答を更新しました... – Anfuca

+2

これは、Firebaseが作成したもの(データのストリーミング)に反するため、これは本当に意図された動作であることを受け入れるのに苦労しています。 – tjclement

0

私は同じ状況にあり、最初の子供が発射するまでに約40秒待っています。私が思いつくことができる唯一の解決策は、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_added機能についてのご質問にお答えしませんが、それはあなたがchild_addedで起こることを期待する何を知っています。私はFirebaseに機能要求を提出し、このSOの質問にリンクします。

関連する問題