DynamoDB: фильтровать и сортировать одно и то же поле?

У меня есть таблица с локальным индексом, как показано ниже.

как сделать запрос типа startDate ‹InvoiceDate‹ endDate и отсортировать результат по убыванию InvoiceDateLocalIndex ??

Насколько мне известно, для сортировки результата мне нужно использовать InvoiceDateLocalIndex. Но если бы я использовал, то получил бы ошибку. Выражение фильтра может содержать только атрибуты непервичного ключа: Атрибут первичного ключа: InvoiceDate

"IndexName": "InvoiceDateLocalIndex",
 "KeySchema": [
  {
     "AttributeName": "FinanceYear",
     "KeyType": "HASH"
  },
  {
     "AttributeName": "InvoiceDate",
     "KeyType": "RANGE"
  }
]

person luan hdwebsoft    schedule 03.08.2020    source источник


Ответы (1)


Действительно, вы не можете использовать FilterExpression над ключом диапазона (InvoiceDate). Но причина этого не в том, что это невозможно сделать - причина, по которой это запрещено, состоит в том, чтобы вы не допустили дорогостоящей ошибки:

Чтобы запросить только диапазон ключа диапазона, следует использовать KeyConditionExpression, а не FilterExpression.

Использование KeyConditionExpression быстрее и дешевле, потому что DynamoDB извлекает только совпадающие элементы, тогда как FilterExpression считывает (и взимает с вас) весь раздел. Вот почему ключи диапазона называются ключами диапазона - они позволяют вам эффективно запрашивать диапазон этого ключа. Их также называют ключом сортировки, потому что они не просто определяют диапазоны - они фактически сортируются.

person Nadav Har'El    schedule 03.08.2020
comment
не могли бы вы привести мне пример использования KeyConditionExpression для решения моего вопроса, поскольку я новичок в DynamoDB и не знаком с синтаксисом запросов Dynamodb (мы используем Dynamoose) - person luan hdwebsoft; 04.08.2020
comment
KeyConditionExpression имеет тот же синтаксис, что и FilterExpression (который, как я полагаю, вы использовали), это просто отдельная переменная, и вам нужно указать там условия для ключевых атрибутов, а не в FilterExpression. Документация находится здесь: docs.aws.amazon.com/amazondynamodb/latest / APIReference / - person Nadav Har'El; 04.08.2020