Из документации DynamoDB
Операция Query позволяет ограничить количество элементов, которые она
возвращает в результате. Для этого установите для параметра Limit значение
максимальное количество предметов, которые вы хотите.
Например, предположим, вы запрашиваете таблицу с предельным значением 6, и
без выражения фильтра. Результат запроса будет содержать первый
шесть элементов из таблицы, которые соответствуют выражению ключевого условия из
запрос.
Теперь предположим, что вы добавили выражение фильтра в запрос. В этом случае,
DynamoDB будет применять выражение фильтра к шести элементам, которые были
вернулся, отбрасывая те, которые не совпадают. Окончательный результат запроса
будет содержать 6 элементов или меньше, в зависимости от количества элементов, которые
были отфильтрованы.
Похоже, следующий запрос должен вернуть (хотя бы иногда) 0 записей.
Итак, у меня есть таблица UserLogins. Упрощенная версия:
1. UserId - HashKey
2. DeviceId - RangeKey
3. ActiveLogin - Boolean
4. TimeToLive - ...
Теперь предположим, что UserId = X имеет 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 строку. 1 активный логин для UserId = X. И это происходит не только для одного пользователя, это происходит для нескольких пользователей в аналогичной ситуации.
Мои результаты противоречат документации DynamoDB?
Это выглядит как противоречие, потому что если maxResultSize = 10, это означает, что DynamoDB будет читать только первые 10 элементов (из 10 001), а затем будет применять фильтр active = true (который может вернуть 0 результатов). Кажется очень маловероятным, что запись с active = true оказалась в первых 10 записях, которые прочитал DynamoDB.
Это происходит с сотнями клиентов, которые выполняют аналогичные запросы. Он прекрасно работает, когда, согласно документации, он не должен работать.