DynamoDB Between запрос на GSI не работает должным образом - PullRequest
2 голосов
/ 11 ноября 2019

Это схема jobPosts , для которой в качестве одного из атрибутов используется значение posts_date. Цель состоит в том, чтобы запросить все посты работы между двумя датами. Вот схема для вашей справки:

{
  'job_id': {S: jobInfo.job_id},
  'company': {S: jobInfo.company},
  'title': {S: jobInfo.title},
  'posted_on': {S: jobInfo.posted_on},
}

posted_on 'основано на строке ISO (2019-11-10T10:52:38.013Z). job_id является первичным ключом (ключом раздела), и, поскольку мне нужно запросить даты, я создал GSI (partition key) в posts_on . Теперь вот запрос:

  const params = {
    TableName : "jobPosts",
    IndexName: 'date_for_filter_purpose-index',
    ProjectionExpression:"job_id, company, title, posted_on",
    KeyConditionExpression: "posted_on BETWEEN :startDate AND :endDate",
    ExpressionAttributeValues: {
        ":startDate": {S: "2019-10-10T10:52:38.013Z"},
        ":endDate": {S: "2019-11-10T10:52:38.013Z"}
    }
  };

У меня есть один документ в DynamoDB, и вот он:

{
  job_id:,
  company: "xyz",
  title: "abc",
  posted_on: "2019-11-01T10:52:38.013Z"
} 

Теперь при выполнении этого я получаю следующую ошибку:

{
    "message": "Query key condition not supported",
    "code": "ValidationException",
    "time": "2019-11-11T06:15:37.231Z",
    "requestId": "J078NON3L8KSJE5E8I3IP9N0IBVV4KQNSO5AEMVJF66Q9ASUAAJG",
    "statusCode": 400,
    "retryable": false,
    "retryDelay": 12.382362030893768
}

Я не знаю, что не так с вышеуказанным запросом.

Обновление после Томми Ответ: Я удалил GSI на posts_on и заново создал таблицу с job_id как partition key и posts_on as sort key. Я получаю следующую ошибку:

{
    "message": "Query condition missed key schema element: job_id",
    "code": "ValidationException",
    "time": "2019-11-12T11:01:48.682Z",
    "requestId": "M9E793UQNJHPN5ULQFJI2NR0BVVV4KQNSO5AEMVJF66Q9ASUAAJG",
    "statusCode": 400,
    "retryable": false,
    "retryDelay": 42.52613025785952
}

Согласно этот ответ SO , GSI должен иметь возможность запрашивать даты, используя ключевое слово BETWEEN .

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Полагаю, это немного нелогично, но DynamoDB поддерживает только .eq условие для атрибутов ключа раздела.

Согласно Документация по ключевым условиям

Выдолжен предоставить имя и значение ключа раздела индекса в качестве условия эквалайзера. При желании вы можете указать второе условие, ссылаясь на ключ сортировки индекса.

Кроме того, в Документация API запросов вы можете найти следующее

Условие должно выполнить проверку на равенство одного значения ключа секции.

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

Это объясняет сообщение об ошибке. получение.

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

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

0 голосов
/ 13 ноября 2019

Ответ , на который вы ссылаетесь , относится к запросу, в котором ключ разделения имеет определенное значение, а ключ сортировки находится в заданном диапазоне. Это аналогично select * from table where status=Z and date between X and Y. Это не то, что вы пытаетесь сделать, если я правильно прочитал ваш вопрос. Вы хотите select * from table where date between X and Y. Вы не можете сделать это с помощью запроса DynamoDB - вы не можете запросить ключ раздела по диапазону.

Если вы знали, что ваш максимальный диапазон дат запроса был в данный день, вы могли бы создать GSI с ключом раздела, установленным на вычисленное значение ГГГГММДД даты / времени, и ключом сортировки которого была полная дата / время. Затем можно выполнить запрос с помощью выражения условия ключа для ключа раздела вычисленного YYYYMMDD и ключа сортировки между X и Y. Чтобы это работало, YYYYMMDD для X и Y должен быть одинаковым.

Если вы знали, что максимальный диапазон дат запроса составляет месяц, вы можете создать GSI с ключом раздела, для которого задан вычисленный YYYYMM даты / времени, а ключом сортировки является полная дата / время. Чтобы это работало, YYYYMM для X и Y должен быть одинаковым.

...