在 AppSync 中使用多个 begin_with 子句查询 DynamoDB

Jos*_*e A 6 velocity amazon-dynamodb graphql apache-velocity aws-appsync

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

我想用“OR”评估一系列begins_with

例如:

{
    "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]}"}

   }

    }
Run Code Online (Sandbox Code Playgroud)

但这是行不通的。我也尝试过使用|代替,or但也没有成功。我得到:

无效的 KeyConditionExpression:语法错误;令牌:“|”,附近:“) | begin_with”(服务:AmazonDynamoDBv2;

如何使用 VTL 实现这一目标?

Ita*_*man 7

原答案

你在 后面缺少一个右括号begins_with(sk, :sk1)。也就是说,第三行应该是:

        "expression": "pk = :pk and (begins_with(sk,:sk) or begins_with(sk, :sk1))"
Run Code Online (Sandbox Code Playgroud)

我刚刚运行了固定表达式,它按预期工作。

修改

其实,还是有微妙之处的。

or运算符可以在过滤表达式中使用,但不能在键条件表达式中使用。例如,a = :v1 and (b = :v2 or b = :v3)只要 和ab“常规”属性,就可以工作。如果ab是表的主键(分区键、排序键),则 DDB 将拒绝查询。