私のアプリは、score
というフィールドで最終スコアが-30から+30までのゲーム結果を保存します。すべてのゲーム結果の全体平均をクエリするにはどうすればよいですか?コレクション内のすべてのゲーム結果の平均スコアをクエリしますか?
1
A
答えて
2
シンプルなソリューション
あなたが書かれているゲームの結果の数が多くて1秒に1回になります知っているなら、あなたは別の文書average/score
を更新するために、クラウド機能を使用することができます。各ゲーム結果の追加について、文書が存在しない場合は、count
というフィールドを1に、score
というフィールドをゲームのスコアに設定します。文書が存在する場合は、count
というフィールドに1
を追加し、score
というフィールドにスコアを追加します。
平均スコアを照会するには、average/score
と入力し、score
をcount
で割ってください。
スケーラブルなソリューション
あなたが疑われるか、書き込まれているゲームの結果の数が毎秒1回超えたことを知っている場合は、簡単な解決策の分散カウンタースタイルを適用する必要があります。
平均文書のためのデータ・モデルは、サブコレクションを使用すると、次のようになります。
更新// ref points to db.collection('average').doc('score')
function createAverageAggregate(ref, num_shards) {
var batch = db.batch();
// Initialize the counter document
batch.set(ref, { num_shards: num_shards });
// Initialize each shard with count=0
for (let i = 0; i < num_shards; i++) {
let shardRef = ref.collection('shards').doc(i.toString());
batch.set(shardRef, { count: 0, count: 0 });
}
// Commit the write batch
return batch.commit();
}
:あなたの更新コードがより合理化にするために
// average/score
{
"num_shards": NUM_SHARDS,
"shards": [subcollection]
}
// average/score/shards/${NUM}
{
"count": 115,
"score": 1472
}
、あなたが最初にこれらの破片を初期化することができますクラウド機能の平均アグリゲートは次のように簡単になりました。
// ref points to db.collection('average').doc('score')
function updateAverage(db, ref, num_shards) {
// Select a shard of the counter at random
const shard_id = Math.floor(Math.random() * num_shards).toString();
const shard_ref = ref.collection('shards').doc(shard_id);
// Update count in a transaction
return db.runTransaction(t => {
return t.get(shard_ref).then(doc => {
const new_count = doc.data().count + 1;
const new_score = doc.data().score + 1;
t.update(shard_ref, { count: new_count, score: new_score });
});
});
}
Gあなたはこのシステムで達成することができます
// ref points to db.collection('average').doc('score')
function getAverage(ref) {
// Sum the count and sum the score of each shard in the subcollection
return ref.collection('shards').get().then(snapshot => {
let total_count = 0;
let total_score = 0;
snapshot.forEach(doc => {
total_count += doc.data().count;
total_score += doc.data().score;
});
return total_score/total_count;
});
}
書き込み速度が毎秒NUM_SHARDSあるので、それに応じ計画:平均をettingすることは、その後に行うことができます。注:小さなものを始めて、簡単に破片の数を増やすことができます。 createAverageAggregate
の新しいバージョンを作成して、最初に新しいものを初期化し、次にnum_shards設定を一致させるように更新して、断片の数を増やしてください。これはあなたのupdateAverage
とgetAverage
の機能によって自動的に選択されます。
関連する問題
- 1. 平均結果をフェッチするmysqlクエリ
- 2. 結果セット行の平均
- 3. ストアドプロシージャの加重(ベイジアン)平均スコア/インデックスを計算しますか?
- 4. ループの結果の平均値を計算します。
- 5. クエリの結果のサイズまたは平均サイズを取得する方法
- 6. ネストされたコレクション内のMongoDB平均
- 7. パンダ:GROUPBY( 'date_x')[ '結果'](平均)
- 8. 関数の結果のソル平均
- 9. Rプログラムと平均結果の印刷
- 10. スコアの平均を見つける
- 11. スコアの平均をとったVBAエラー
- 12. MongoDBのは、私はこのようになります文書のコレクションを持って集計平均結果
- 13. 平均スコア以下のプレーヤースコアリングプログラムの表示
- 14. 文字列内のすべてのクエリの結果を実現
- 15. エラーをスキップしている平均式の結果
- 16. クエリの結果をすべて表示
- 17. ゲーム内のスコア増加コントロール
- 18. 各生徒の合計スコアを計算して保存し、クラス全体の平均スコアを計算します。
- 19. Apache Bench:すべての同時リクエストの平均と平均
- 20. Luceneスコアの結果
- 21. イメージ内のすべてのファイルを平均する方法
- 22. 個々の平均と累積平均と最高平均スコアを記録する
- 23. 効率的なmongodbクエリを使用して、10K +レコードのコレクションの平均時間を検索しますか?
- 24. グループの結果の平均を取得する
- 25. コレクション内の結果をコレクションから除外せずにフィルタリングします。
- 26. SQL:半径(緯度/経度)内の結果セットからの平均
- 27. 別のクエリの結果でクエリ結果を除算します。
- 28. クエリ内で複数の結果を使用してクエリ内で結合する
- 29. SonarQube - すべてのプロジェクトの平均値
- 30. すべてのコンプレッションの平均コストを計算する平均コストを