3

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

我想用“OR”评估一系列 begin_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]}"}

   }

    }

但这行不通。我也尝试过使用|而不是,or但它也没有奏效。我得到:

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

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

4

2 回答 2

5

原始答案

您在 . 之后缺少右括号begins_with(sk, :sk1)。也就是说,第三行应该是:

        "expression": "pk = :pk and (begins_with(sk,:sk) or begins_with(sk, :sk1))"

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

修改

其实也有微妙之处。

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

于 2019-08-30T03:53:53.420 回答
1

阅读这个答案似乎是不可能的,因为 DynamoDB 只接受一个排序键值和一个操作。

操作中也没有“或”条件: https ://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html#DDB-Query-request-KeyConditionExpression

如果您还想为排序键提供条件,则必须使用 AND 与排序键的条件组合。下面是一个示例,使用 = 比较运算符作为排序键:

我将重组访问模式以更好地满足我的要求。

于 2019-08-30T10:27:16.327 回答