[解決済み] Firebaseで、ノードのデータを全て読み込むことなく、ノードの子ノードの数を取得する方法はありますか?
質問
子プロセスの数は
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);
});
```
関連
-
2021MySql-8.0.26インストール詳細チュートリアル(ベビーシッターレベル)
-
Hibernateでhibernate.propertiesが見つからない問題とデータベース方言の更新の問題
-
SocketTimeoutExceptionが発生しました。読み取りがタイムアウトした問題のトラブルシューティング
-
[Mac] sudo mongod コマンド、プロンプトコマンドが見つかりません。
-
mybatis バッチアップデートのSQL文は正常だが、SQLの文法が悪い [] エラーが報告される
-
MySQL cumsum(累積)の実装
-
[解決済み] アプリケーション開発者が陥りやすいデータベース開発の失敗例【終了しました
-
[解決済み] MongoDBまたはCouchDB - 生産のためのフィット?[クローズド]を
-
[解決済み】Firebase Console を使用せずに Firebase Cloud Messaging 通知を送信するには?
-
[解決済み】シャーディングとは何ですか、なぜそれが重要なのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
親行が削除または更新できない: 外部キー制約に失敗 解決策
-
IEntityChangeTracker の複数のインスタンスからエンティティオブジェクトを参照できない場合の対処法
-
SSISエラーコード DTS_E_OLEDBERROR.an OLE DBエラーが発生しました。エラーコード 0x80040E21 備考
-
db2 エラー sqlcode=-420 自動型変換問題
-
pymongo.errors.OperationFailure:オーバーフローソートステージのバッファリングデータの使用量が内部制限を超える
-
PostgreSQLのエラー[ERROR: relation "xxxx" does not exist]を解決する。
-
DB2におけるNULLおよびNULL処理
-
データファイルのsqlldrフィールドが最大長を超えています。
-
[解決済み] VARCHAR(255) が(他の長さではなく)頻繁に使用されているのを見るのは、何か理由があるのでしょうか?
-
[解決済み] PostgreSQLでタイムスタンプを自動更新する方法