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

时间:2019-08-30 03:20:08

标签: amazon-dynamodb graphql velocity aws-appsync apache-velocity

我目前正在尝试使用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]}"}

   }

    }

但这不起作用。我也尝试使用|代替or,但是它也没有用。我得到:

  

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

如何使用VTL做到这一点?

2 个答案:

答案 0 :(得分:1)

原始答案

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)a是“常规”属性,b就可以工作。如果ab是表的主键(分区键,排序键),则DDB将拒绝查询。

答案 1 :(得分:0)

读取this answer似乎是不可能的,因为DynamoDB仅接受单个Sort键值和单个操作。

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

  

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

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