Дают ли запросы DynamoDB составного ключа сортировки, составленного из двух дат ISO 8061, правильные результаты (с МЕЖДУ)? - PullRequest
0 голосов
/ 26 апреля 2018

Кажется, что консенсус для обработки объектов даты сортировки (формат ISO 8061) в DynamoDB заключается в использовании типа ключа STRING, где в случае запроса будет использоваться сравнение BETWEEN для поиска результатов между двумя датами (также ISO 8061),см. ответ:

  1. Можно ли сохранить дату и время в DynamoDB?

Мой вопрос: работает ли механизм сравнения строк DynamoDB?«МЕЖДУ», которое включает вышеуказанную функциональность ТАКЖЕ , позволяет запрашивать ДВА объекта даты, сшитых вместе (пример: 2018-05-01-2018-05-10 ), как один ключ сортировкигде первая сшитая дата ВСЕГДА до второй сшитой даты.

После первоначального тестирования ПОЯВЛЯЕТСЯ, что ответом является ДА, если ваш запрос BETWEEN также имеет две объединенные даты, это должно бытьвозможный.

Я надеюсь, что кто-то может помочь мне выяснить, будет ли это безопасным / стабильным для развертывания.

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

С учетом ключа сортировки: 2018-05-01-2018-05-25

  1. Запрос МЕЖДУ 2018-05-01-2018-05-20 и 2018-05-01-2018-05-26 (ВОЗВРАЩАЕТСЯ элемент)
  2. Запрос МЕЖДУ 2018-05-01-2018-05-20 и 2018-05-01-2018-05-24 ( Данные не найдены )
  3. Запрос МЕЖДУ 2018-05-01-2018-05-20 и 2018-05-01-2018-05-25 (ВОЗВРАЩАЕТСЯ элемент)
  4. Запрос МЕЖДУ 2018-05-02-2018-05-20 и 2018-05-02-2018-05-26 ( Нет данныхНайдено )

Справочная информация


Я работаю над созданием запрашиваемой таблицы комбинаций рейсов DynamoDB, в которой я бы хотел, чтобы Запрос проверял,дата вылета рейса - ПОСЛЕ определенной даты, а также, является ли обратный рейс раньше определенного срока.e.

По сути, я понимаю, что между запросами по ISO 8061 даты в DynamoDB работают из-за того, что числа каскадируются слева направо (год-месяц-дата).Если это так, тогда (в моих обстоятельствах) было бы безопасно соединить две даты в один ключ сортировки.

Представление значения ключа сортировки будет выглядеть следующим образом: *

  • partDate1-returnDate2
  • год-месяц-дата-год-месяц-дата

Я предварительно проверяю данные, чтобы можно было предположить, что исходящий рейс (первая объединенная дата) ВСЕГДА ДО ПЕРЕД возвращающимся рейсом (вторая объединенная дата), если он есть в нашей таблице, поэтому, учитывая операцию МЕЖДУ, мое предположениеявляется то, что это ДОЛЖНО быть возможным.

Я опубликую пост после дополнительного тестирования, но я надеюсь, что у кого-то будет больше опыта с тем, как (и почему) функция DynamoDB BETWEEN Query работает в этом случае.

1 Ответ

0 голосов
/ 31 августа 2018

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

Краткий ответ:

В зависимости от ваших целей.Вы можете связать несколько дат по ISO 8061 в ключе сортировки на DynamoDB и использовать функцию «Между» - однако для обеспечения идеального соответствия вторую дату все равно нужно будет пройти через фильтр.

Намного дольше Ответить сПримеры

Если ваша цель - использовать ключ составной сортировки, чтобы сначала уменьшить количество возвращаемых записей, а затем отфильтровать их - тогда все в порядке.Это позволяет ограничить количество записей, которые необходимо отфильтровать (поскольку во многих случаях запрос Sort Key BETWEEN фактически отфильтровывает нежелательные сообщения).

Однако онне работает / не возвращает результаты цели во всех случаях.

Так для примера части данных (Ключ сортировки) в DyanmoDB: 2018-09-01_2018-09-07

Нашей целью здесь было бы ТОЛЬКО вернуть данные, где ОБА дата начала (2018-09-01 в случае примера) и дата окончания (2018-09-07 в случае вышеупомянутого примера) находятся в пределахграницы нашего запроса.

Простой пример запроса для возврата вышеуказанного объекта данных будет выглядеть так:

Between 2018-08-15_2018-09-07 and 2018-09-05_2018-09-08

Сначала может показаться, что запрос работает (как упоминалось в моем первоначальном вопросе), так как выше возвращает данные примера. Проблема в том, что это не всегда так.

Пример взлома Сортировка Ключ

Пример составного Сортировка по ИСО 8061 Контрольная дата, когдабудет возвращен вышеупомянутым запросом, но НЕ вписывается в начальную / конечную дату цели нашего намерения Запросы:

2018-09-04_2018-09-15

В то время как начальныйдата начала находится в пределах наших целей - тот факт, что дата начала меньше максимума даты начала (2018-09-05), приводит к тому, что дата окончания разрешается сверх нашего идеального максимума даты окончания - поскольку общее число все еще меньше, чемнаш максимум.

Это из-за того, как DynamoDB смотрит на Между запросами ...

Замечания по DynamoDB Между Логиками

DynamoDB в основном видит даты ISO 8061 как числовое представлениетой же даты без черты.Итак, 2018-09-01 = 20180901 .Поскольку каскад дат ISO 8061 от самого большого к наименьшему, два из них вместе выглядят (для «Динамо») следующим образом: 2018090120180907.

Как только удаляются совпадающие друг с другом символы, он просто делает простое сравнение чисел «Больше, чем»./ Меньше, чем.

Все еще полезно?

Итак, как уже упоминалось, вы получаете данные, которые не хотите возвращать из запроса Between, который применяется к составному ключу сортировки с двумя (или более) датами ISO 8061, объединеннымивсе вместе.НО, если ваша цель состоит в том, чтобы сначала уменьшить количество возвращаемых записей для более эффективной фильтрации - тогда это все равно может быть полезно (в зависимости от вашего варианта использования).

Вы просто должны планироватьТАКЖЕ запустить фильтр по вашим возвращенным данным запроса, чтобы убедиться, что все даты находятся в пределах границ.

...