1

DynamoDB のドキュメントから

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

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

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

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

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

1. UserId - HashKey
2. DeviceId - RangeKey
3. ActiveLogin - Boolean
4. TimeToLive - ...

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

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

QuerySpec{
hashKey: null,
rangeKeyCondition: null,
queryFilters: null, 
nameMap: {"#0" -> "UserId"}, {"#1" -> "ActiveLogin"}
valueMap: {":0" -> "X"}, {":1" -> "true"}
exclusiveStartKey: null,
maxPageSize: null, 
maxResultSize: 10,
req: {TableName: UserLogins,ConsistentRead: true,ReturnConsumedCapacity: TOTAL,FilterExpression: #1 = :1,KeyConditionExpression: #0 = :0,ExpressionAttributeNames: {#0=UserId, #1=ActiveLogin},ExpressionAttributeValues: {:0={S: X,}, :1={BOOL: true}}}

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

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

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

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

4

1 に答える 1