【问题标题】:Query DynamoDB with multiple begins_with clause in AppSync在 AppSync 中使用多个 begin_with 子句查询 DynamoDB
【发布时间】:2020-01-03 07:33:51
【问题描述】:

我目前正在尝试使用 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 实现这一目标?

【问题讨论】:

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


    【解决方案1】:

    原答案

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

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

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

    修订

    其实也有微妙之处。

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

    【讨论】:

    • 感谢 Itay 的回答?...您是使用文本上下文运行还是尝试针对 GraphQL 运行它?我一直在检查,我认为这确实是不可能的。
    • 我错过了您表中的pksk 是表的分区和排序键的事实。请看我修改后的答案。
    • 这正是我发现的! ? 感谢您的证实。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 2021-04-04
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 2023-03-30
      • 2019-02-25
      相关资源
      最近更新 更多