在 AppSync 中使用多个 begins_with 子句查询 DynamoDB
Query DynamoDB with multiple begins_with clause in AppSync
我目前正在尝试使用 AppSync 和 Apache Velocity 模板语言 (VTL) 创建动态查询。
我想评估 begins_with 和 "OR"
系列
如:
{
"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
但它也没有用。我得到:
Invalid KeyConditionExpression: Syntax error; token: "|", near: ") | begins_with" (Service: AmazonDynamoDBv2;
如何使用 VTL 实现此目的?
原回答
您在 begins_with(sk, :sk1)
后缺少右括号。即第三行应该是:
"expression": "pk = :pk and (begins_with(sk,:sk) or begins_with(sk, :sk1))"
我只是 运行 固定表达式,它按预期工作。
修订
其实也有微妙之处。
or
运算符可以用在过滤器表达式中,但不能用在键条件表达式中。例如,只要 a
和 b
是 "regular" 属性,a = :v1 and (b = :v2 or b = :v3)
就可以工作。如果 a
和 b
是 table 的主键(分区键,排序键),那么 DDB 将拒绝查询。
阅读 this answer 似乎这是不可能的,因为 DynamoDB 只接受单个排序键值和单个操作。
操作中也没有"OR"条件:
https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html#DDB-Query-request-KeyConditionExpression
If you also want to provide a condition for the sort key, it must be combined using AND with the condition for the sort key. Following is an example, using the = comparison operator for the sort key:
我将重组访问模式以更好地满足我的要求。
我目前正在尝试使用 AppSync 和 Apache Velocity 模板语言 (VTL) 创建动态查询。
我想评估 begins_with 和 "OR"
系列如:
{
"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
但它也没有用。我得到:
Invalid KeyConditionExpression: Syntax error; token: "|", near: ") | begins_with" (Service: AmazonDynamoDBv2;
如何使用 VTL 实现此目的?
原回答
您在 begins_with(sk, :sk1)
后缺少右括号。即第三行应该是:
"expression": "pk = :pk and (begins_with(sk,:sk) or begins_with(sk, :sk1))"
我只是 运行 固定表达式,它按预期工作。
修订
其实也有微妙之处。
or
运算符可以用在过滤器表达式中,但不能用在键条件表达式中。例如,只要 a
和 b
是 "regular" 属性,a = :v1 and (b = :v2 or b = :v3)
就可以工作。如果 a
和 b
是 table 的主键(分区键,排序键),那么 DDB 将拒绝查询。
阅读 this answer 似乎这是不可能的,因为 DynamoDB 只接受单个排序键值和单个操作。
操作中也没有"OR"条件: https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html#DDB-Query-request-KeyConditionExpression
If you also want to provide a condition for the sort key, it must be combined using AND with the condition for the sort key. Following is an example, using the = comparison operator for the sort key:
我将重组访问模式以更好地满足我的要求。