Запросите DynamoDB, выполнив операцию IN (begins_with (условное-выражение)) для ключа сортировки

Я в ситуации, когда нужно запросить DynamoDB, где у меня есть hashKey (objectId) и у меня есть префикс для sortKey (versionId).

Я хотел бы добиться чего-то вроде ниже:

QuerySpec querySpec = new QuerySpec();
querySpec.withKeyConditionExpression("objectId = :v_objectId and (annotationIdVersion IN (:v_objectId, begins_with(versionId, :v_prefix)))")
            .withValueMap(new ValueMap().withString(":v_objectId", objectId).withString(":v_prefix", "v0_"));
table.query(querySpec);

В приведенном выше примере я пытаюсь проверить, равен ли мой versionId «objectId» или «some_prefix».

Я обнаружил, что функция begin_with в DynamoDB помогает выполнить запрос на основе префикса.

Но я не уверен, что оператор IN принимает функцию begin_with. Я ищу любые предложения по достижению вышеуказанного варианта использования.

Любое предложение будет оценено. Заранее спасибо.

Вы пробовали вышеизложенное на реальном столе?

best wishes 20.02.2019 03:59

Да, было выдано исключение, говорящее, что я не могу использовать begin_with в этом выражении.

Deepak 20.02.2019 04:04

вы можете использовать составные ключи для ключа сортировки, например, objectId и some_prefix становятся version#objectId и version#some_prefix соответственно, тогда вы можете запросить их оба в одном запросе

best wishes 20.02.2019 06:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
428
2

Ответы 2

ключ сортировки не поддерживает "IN", только FilterExpression поддерживает

поэтому вы можете запросить objectId = :v_objectId, а затем отфильтровать

{
        "TableName": "tpl_name",
        "KeyConditionExpression": " objectId = :objectId_value ",
        "FilterExpression": "( annotationIdVersion IN (:v1,:v2,:v3 ) )",
        "ExpressionAttributeValues": {
            ":objectId_value": {
                "S": "myobjid"
            },
            ":v1": {
                "S": "a"
            },
            ":v2": {
                "S": "b"
            },
            ":v3": {
                "S": "c"
            }
        }
    }

если вы понимаете мой вопрос, я спрашиваю, могу ли я использовать функцию begin_with в операции IN.

Deepak 20.02.2019 16:41

Нет, ты не можешь этого сделать. См. документация для выражений условий.

Соответствующий синтаксис вверху страницы:

condition-expression ::=
    operand IN ( operand (',' operand (, ...) ))

Где операнд определяется как имя атрибута верхнего уровня или путь к документу, который ссылается на вложенный атрибут. Другими словами, поддерживаются только атрибуты, а не такие функции, как begins_with.

Другие вопросы по теме