1

Google Datastoreが自分のニーズに合うかどうかを理解しようとしています。Google Datastoreの多くのエンティティで合計を実行するにはどうすればよいですか?

私は多くのエンティティを持っており、特定のプロパティで合計を実行する必要があります。 基本的には、select count(value1) from entity1 where [some filter]を実行したいと思います。entity1は、フィールド/プロパティーの一部の種類のデータを追跡するエンティティですvalue1

私はこれらの関数がリレーショナルデータベースではないため、データストアでは使用できないことを知っています。したがって、最も直接的な解決策はselectを実行し、アプリケーションの結果セットの合計を計算することです。だから私は(nodejsを使用して、しかし、私は、言語を気にしない)のようなものを持っているでしょう:

query = client.query(kind='Task') 
query.add_filter('done', '=', False) 
results = list(query.fetch()) 

total = 0 
for(v in results) 
    total += v.value 

問題は結果が300の000の記録等であってもよいので、私は、何千ものレコードを持っているということです。

ボトルネックを起こさずにこれを行うには、どのような方法が最適ですか?

+0

最初の質問ですが、どのくらいの頻度でこれを行う必要がありますか?次に、「完了」タスクのステータスは更新されますか?これらの数字の両方が、あなたが取るアプローチに影響を与える可能性があります。たとえば、カウントを増やしたり、バッチ処理を行うだけです。あなたが何かを数えたら、もう一度数える必要がありますか? –

+0

読み取り操作(データの合計を要求する操作)が頻繁に行われます。 「完了」は単なる例に過ぎませんでした。 カウントは、必要に応じて再実行する必要があります。 –

+0

これは時折のみ実行する場合、ボトルネックとはどういう意味ですか?合計を実行するためにあなたの懸念全体の実行時間ですか?私は、300kレコードの合計にはおよそ2〜5分かかると推測します。 –

答えて

1

合計金額を別のエンティティに保存することができます。ユーザーが要求する頻度に関係なく、ミリ秒以内に返すことができます。

合計に含まれるエンティティが変更されると、エンティティの合計が変更されます。たとえば、プロパティが300から500に変更された場合は、合計を200ずつ増やします。これにより、合計が常に正確になります。

更新が頻繁に発生する場合は、これらの更新を競合状態を防止するためにタスクとして追加する(タスクキューAPI)ことができます。これらのタスクは非常に迅速に実行されるため、ユーザーは尋ねるたびに非常に「新鮮な」合計を得ることができます。

0

おそらく、Google Datastoreでカウントする最良の方法は、公式の解決策です:Shard Count