Как я могу запросить DynamoDB с сортировкой и ограничением для параметра без сортировки ключа? - PullRequest
1 голос
/ 17 июня 2019

Я пытаюсь создать простое «табло» с использованием DynamoDB и API Gateway.Я могу вытащить прямо из Динамо просто отлично, но я хочу показать только первые 10 рядов.По сути, API Gateway должен возвращать только 10 лучших результатов.База данных использует общее значение для своего ключа раздела, чтобы вернуть все.Я установил ключ сортировки на отметку времени, чтобы убедиться, что каждая строка уникальна.Два других столбца - «псевдоним» и «оценка».Я хотел бы иметь возможность просто вытянуть первые 10 строк на основе столбца оценки.Есть идеи?

Это мой шаблон сопоставления:

{
    "TableName": "pacman",
    "KeyConditionExpression": "entire = :v1 AND recordTime > :v2",
    "ExpressionAttributeValues": {
        ":v1": {
            "S": "$input.params('entire')"
        },
        ":v2": {
            "S": "$input.params('recordTime')"
        }
    }
}

Сейчас он успешно возвращает все строки в моей таблице.

1 Ответ

1 голос
/ 18 июня 2019

Не имея score в качестве ключа сортировки для вашей таблицы, вам нужно будет выполнить полное сканирование таблицы, которое со временем может стать дорогостоящим, особенно по мере роста вашей базы данных. Если известно, что ваши данные имеют согласованную схему, альтернативы RDS (MySQL, PostgreSQL) могут быть лучшим инструментом для этой работы.

Если вы настроены на DynamoDB, в зависимости от вашего шаблона доступа, и если вы обнаружите, что последовательно выполняете это действие, может иметь смысл иметь другую таблицу с score в качестве ключа сортировки. Вы можете сделать это, создав Глобальный вторичный индекс или Локальный вторичный индекс , который автоматически синхронизируется с вашей базовой таблицей. На этой странице есть полезный пример с табло, которое очень похоже на то, что вы ищете.

Получив второй индекс или изменив ключ сортировки на score, вы можете выполнить более эффективный query из кода своего приложения со следующими ограничениями:

  • Установите для параметра ScanIndexForward значение false, чтобы выполнить поиск в порядке убывания (сначала набирается наибольшее количество баллов)

  • Установите для параметра limit значение 10, чтобы прекратить дальнейшие запросы к DynamoDB после возвращения максимального количества элементов

В качестве запроса это будет выглядеть следующим образом:

QueryParam = {
       TableName: 'pacman',
       IndexName: 'ScoreIndex', // Name of your local/global secondary index
       KeyConditionExpression: "Score = :Score  ", // Shared partition key
       ExpressionAttributeValues: {
          ":UserId": UserId,
       },
       ScanIndexForward: false, // false for descending order
       Limit: 10 // Limit response to 10 items
    }

В качестве альтернативы, вы можете внести изменения в ваш первичный ключ, набрав , сделав его уникальной комбинацией date и score, чтобы иметь возможность эффективно запрашивать несколько параметров.

...