AWS DynamoDB |Как запросить метки времени между двумя датами? - PullRequest
1 голос
/ 07 ноября 2019

У меня есть таблица с пользователями, где я хочу опросить всех пользователей, созданных в апреле.

Когда пользователь создается, для него автоматически создается временная метка.

Я сделал индекс в своей таблице, отметка времени в качестве ключа раздела и идентификатор в качестве ключа сортировки.

Метка времени указывается в миллисекундах Unix.

Это мой код для этого запроса:

GetUsersOnTimestamp(): Promise<any> {
    return new Promise( (resolve, reject) => {

        const _dynamoDB = new AWS.DynamoDB.DocumentClient();
        const startDate = 1554069600000;
        const endDate = 1556661600000;

        const params = {
            TableName: 'user-table',
            IndexName: 'timestamp-id-index',
            KeyConditionExpression: '#timestamp = :hkey BETWEEN :sdate AND :edate',
            ExpressionAttributeNames: {
                '#timestamp': 'timestamp'
            },
            ExpressionAttributeValues: {
                ':hkey': 'timestamp',
                ':sdate': startDate,
                ':edate': endDate,
            }
        };

Я получаю следующую ошибку:

ExpressionAttributeValues contains invalid key: Syntax error; key: "hkey"

1 Ответ

3 голосов
/ 07 ноября 2019

Вы не можете условно запросить ключ раздела. Вы должны указать полное значение ключа раздела без каких-либо условий. Оператор сравнения BETWEEN доступен только для условного запроса ключа сортировки.

Из документации DynamoDB :

Необходимо указать имя ключа раздела изначение как условие равенства.

При желании можно указать второе условие для ключа сортировки (если имеется). Условие ключа сортировки должно использовать один из следующих операторов сравнения:

  • a = b - true, если атрибут a равен значению b
  • a - истина, если a меньше b
  • a<= b </em> - true, если a меньше или равно b
  • a> b - true, если больше b
  • a> = b - истина, если a больше или равно b
  • a МЕЖДУ b И c - истина, если a больше или равно b и меньше или равно c.

также поддерживается следующая функция:

  • begin_with (a, substr) - true, если значение атрибута a начинается с определенной подстроки.

Чтобы получить возможность запрашивать диапазон временных меток, достичь DynamoDB непросто. Одним из решений будет добавление дополнительного поля к вашим элементам, которое будет содержать только год и месяц вашей метки времени. Затем можно создать глобальный вторичный индекс (GSI) с полем года-месяца в качестве первичного ключа и полной отметкой времени в качестве ключа сортировки. При таком подходе вы можете опрашивать всех пользователей, созданных за данный месяц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...