Amazon dynamodb 在AppSync中使用多个BEGINTS\U with子句查询DynamoDB
我目前正在尝试使用AppSync和ApacheVelocity模板语言(VTL)创建一个动态查询 我想评估以“或”开头的系列 例如:Amazon dynamodb 在AppSync中使用多个BEGINTS\U with子句查询DynamoDB,amazon-dynamodb,graphql,velocity,aws-appsync,apache-velocity,Amazon Dynamodb,Graphql,Velocity,Aws Appsync,Apache Velocity,我目前正在尝试使用AppSync和ApacheVelocity模板语言(VTL)创建一个动态查询 我想评估以“或”开头的系列 例如: { "operation": "Query", "query": { "expression": "pk = :pk and (begins_with(sk,:sk) or begins_with(sk, :sk1)", "expressionValues": { ":pk": { "S": "tenan
{
"operation": "Query",
"query": {
"expression": "pk = :pk and (begins_with(sk,:sk) or begins_with(sk, :sk1)",
"expressionValues": {
":pk": { "S": "tenant:${context.args.tenantId}",
":sk": {"S": "my-sort-key-${context.args.evidenceId[0]}"},
":sk1": {"S": "my-sort-key-${context.args.evidenceId[1]}"}
}
}
但这是行不通的。我也尝试过使用|
而不是或
,但它也不起作用。我得到:
无效的KeyConditionExpression:语法错误;标记:“|”,靠近:”)|以“(服务:AmazonDynamoDBv2
如何使用VTL实现这一点?原始答案 在
以(sk,:sk1)
开头后缺少一个右括号。也就是说,第三行应该是:
"expression": "pk = :pk and (begins_with(sk,:sk) or begins_with(sk, :sk1))"
我只是运行了固定表达式,它按预期工作
修订版
事实上,有一些微妙之处
或
运算符可以在筛选表达式中使用,但不能在键条件表达式中使用。例如,a=:v1和(b=:v2或b=:v3)
只要a
和b
是“常规”属性就可以工作。如果a
和b
是表的主键(分区键、排序键)然后DDB将拒绝该查询。读取似乎不可能,因为DynamoDB只接受一个排序键值和一个操作
操作中也没有“或”条件:
如果还希望为排序键提供条件,则必须使用AND将其与排序键的条件组合。以下是使用=比较运算符作为排序键的示例:
我将重新构造访问模式,以更好地匹配我的请求。谢谢,我的回答是,我错过了一个事实,即表中的
pk
和sk
是表的分区和排序键。请查看我修改的答案。这正是我发现的!