DynamoDB QuerySpec {MaxResultSize + выражение фильтра} - PullRequest
0 голосов
/ 05 ноября 2018

Из документации 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.

Это происходит с сотнями клиентов, которые выполняют аналогичные запросы. Он прекрасно работает, когда, согласно документации, он не должен работать.

1 Ответ

0 голосов
/ 05 ноября 2018

Я не вижу очевидной проблемы с Запросом. Вы уверены, что у каждого пользователя по 10 000 единиц товара?

Ваши ключи - это UserId и DeviceId. Кажется, это означает, что если ваш пользователь войдет в систему с того же устройства, он перезапишет существующий элемент. Или, другими словами, я думаю, вы говорите, что у ваших пользователей по 10 000 разных устройств (если только DeviceId не вращается).

На вашем месте я бы просто удалил фильтрационное выражение и распечатал результаты в журнал, чтобы увидеть, что вы получаете в своих 10 результатах. Затем уберите лимит и посмотрите, какие результаты вы получите с этим.

...