1. ホーム
  2. database

[解決済み] Firebaseで、ノードのデータを全て読み込むことなく、ノードの子ノードの数を取得する方法はありますか?

2022-06-09 05:10:03

質問

子プロセスの数は

firebase_node.once('value', function(snapshot) { alert('Count: ' + snapshot.numChildren()); });

しかし、これはサーバからそのノードのサブツリー全体をフェッチしていると思います。巨大なリストでは、これは RAM とレイテンシを大量に消費するように思われます。全体をフェッチすることなく、カウント (および/または子名のリスト) を取得する方法はありますか?

どのように解決するのですか?

あなたが与えたコード スニペットは、確かにデータ セット全体をロードし、クライアント側でそれをカウントします。これは、大量のデータに対して非常に遅くなることがあります。

Firebaseには現在、データを読み込まずに子供を数える方法はありませんが、追加する予定です。

今のところ、1つの解決策は、子供の数のカウンターを維持し、新しい子供を追加するたびにそれを更新することでしょう。upvodes を追跡するこのコードのように、アイテムをカウントするトランザクションを使用することができます。

var upvotesRef = new Firebase('https://docs-examples.firebaseio.com/android/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY/upvotes');
upvotesRef.transaction(function (current_value) {
  return (current_value || 0) + 1;
});

詳細については https://www.firebase.com/docs/transactions.html

UPDATEです。 Firebaseは最近Cloud Functionsをリリースしました。Cloud Functionsを使うと、自分でServerを作る必要がありません。JavaScriptの関数を書いて、Firebaseにアップロードするだけです。Firebaseは、イベントが発生するたびに関数をトリガーする役割を担います。

例えば、アップボートをカウントしたい場合、このような構造を作る必要があります。

{
  "posts" : {
    "-JRHTHaIs-jNPLXOQivY" : {
      "upvotes_count":5,
      "upvotes" : {
      "userX" : true,
      "userY" : true,
      "userZ" : true,
      ...
    }
    }
  }
}

そして、javascriptの関数で upvotes_count に新しい書き込みがあったときに upvotes ノードに新しい書き込みがあったときです。

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.countlikes = functions.database.ref('/posts/$postid/upvotes').onWrite(event => {
  return event.data.ref.parent.child('upvotes_count').set(event.data.numChildren());
});

を読むことができます。 ドキュメンテーション を読んで、どのように クラウドファンクションを始める .

また、投稿をカウントする別の例として、こちらがあります。 https://github.com/firebase/functions-samples/blob/master/child-count/functions/index.js

2018年1月更新

firebase docs が変更され、代わりに event の代わりに change となり context .

この例では、次のようなエラーが発生します。 event.data は未定義です。このパターンの方がうまくいくようです。

exports.countPrescriptions = functions.database.ref(`/prescriptions`).onWrite((change, context) => {
    const data = change.after.val();
    const count = Object.keys(data).length;
    return change.after.ref.child('_count').set(count);
});

```