Я в ситуации, когда нужно запросить 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. Я ищу любые предложения по достижению вышеуказанного варианта использования.
Любое предложение будет оценено. Заранее спасибо.
Да, было выдано исключение, говорящее, что я не могу использовать begin_with в этом выражении.
вы можете использовать составные ключи для ключа сортировки, например, objectId и some_prefix становятся version#objectId и version#some_prefix соответственно, тогда вы можете запросить их оба в одном запросе




ключ сортировки не поддерживает "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.
Нет, ты не можешь этого сделать. См. документация для выражений условий.
Соответствующий синтаксис вверху страницы:
condition-expression ::=
operand IN ( operand (',' operand (, ...) ))
Где операнд определяется как имя атрибута верхнего уровня или путь к документу, который ссылается на вложенный атрибут. Другими словами, поддерживаются только атрибуты, а не такие функции, как begins_with.
Вы пробовали вышеизложенное на реальном столе?