Amazon dynamodb 在AppSync中使用多个BEGINTS\U with子句查询DynamoDB

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

我目前正在尝试使用AppSync和ApacheVelocity模板语言(VTL)创建一个动态查询

我想评估以“或”开头的系列

例如:

{
    "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
是表的分区和排序键。请查看我修改的答案。这正是我发现的!