問題タブ [dynamodb-queries]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
702 参照

amazon-dynamodb - DynamoDB の主キーの一部である属性値を更新することはできますか?

「RefNumber」、「status」、「Date」のテーブルがあります。「RefNumber」はパーティションキー、「Status」はソートキーなので、どちらも主キーになります。

このレコードを取得した後、「ステータス」を「1」に更新したいと思います。複数のワーカーが DynamoDB レコードを読み取っています。2 つのワーカーが同じレコードを処理するのを避けるために、ConditionExpression を使用して「ステータス」を「1」で取得および更新します。更新が成功した場合、ワーカーはそれ以外の場合はスキップします。

私の質問は、dynamodb の主キーの一部である属性値を更新するのは良い設計ですか?

0 投票する
1 に答える
487 参照

amazon-web-services - DynamoDB QuerySpec {MaxResultSize + フィルター式}

DynamoDB のドキュメントから

Query オペレーションを使用すると、結果で返されるアイテムの数を制限できます。これを行うには、Limit パラメータを必要なアイテムの最大数に設定します。

たとえば、制限値を 6 に設定し、フィルター式を使用せずに、テーブルをクエリするとします。クエリ結果には、リクエストのキー条件式に一致するテーブルの最初の 6 つの項目が含まれます。

ここで、クエリにフィルター式を追加するとします。この場合、DynamoDB は返された 6 つの項目にフィルター式を適用し、一致しない項目を破棄します。フィルタリングされたアイテムの数に応じて、最終的なクエリ結果には 6 個以下のアイテムが含まれます。

次のクエリは (少なくとも場合によっては) 0 件のレコードを返す必要があるようです。

要約すると、UserLogins テーブルがあります。簡略化されたバージョンは次のとおりです。

ここで、UserId = X が異なる DeviceId で 10,000 の非アクティブなログインと 1 つのアクティブなログインを持っているとします。

ただし、DynamoDB テーブルに対してこのクエリを実行すると、次のようになります。

私は常に1行を取得します。UserId=X の 1 つのアクティブなログイン。1 人のユーザーだけでなく、複数のユーザーが同様の状況で発生しています。

結果は DynamoDB のドキュメントと矛盾していますか?

maxResultSize=10 の場合、DynamoDB は最初の 10 アイテム (10,001 のうち) のみを読み取り、フィルター active=true のみを適用することを意味するため、矛盾しているように見えます (0 の結果が返される可能性があります)。DynamoDB が読み取った最初の 10 レコードに active=true のレコードが含まれている可能性は非常に低いようです。

これは、同様のクエリを実行している何百もの顧客で発生しています。ドキュメントによれば、動作しないはずの場合でも、うまく機能します。