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 のレコードが含まれている可能性は非常に低いようです。
これは、同様のクエリを実行している何百もの顧客で発生しています。ドキュメントによれば、動作しないはずの場合でも、うまく機能します。