GSI 上的 DynamoDB gt() 查询
DynamoDB gt() query on GSI
我正在尝试获取与 DynamoDB GSI 一起使用的 gt()
查询
我的Cloudformation如下-
Resources
MyTable:
Properties:
AttributeDefinitions:
- AttributeName: pk
AttributeType: S
- AttributeName: sk
AttributeType: S
- AttributeName: my_datetime_string
AttributeType: S
BillingMode: PAY_PER_REQUEST
GlobalSecondaryIndexes:
- IndexName: my_datetime_string-index
KeySchema:
- AttributeName: my_datetime_string
KeyType: HASH
Projection:
ProjectionType: ALL
KeySchema:
- AttributeName: pk
KeyType: HASH
- AttributeName: sk
KeyType: RANGE
TableName:
Fn::Sub: my-table-${AWS::StackName}-${AWS::Region}
Type: AWS::DynamoDB::Table
我的查询代码如下(python) -
tablename="whatever"
import boto3
table=boto3.resource("dynamodb").Table(tablename)
from datetime import datetime
timestamp="%s 00:00:00" % datetime.today().strftime("%Y-%m-%d")
from boto3.dynamodb.conditions import Key
expr=Key("my_datetime_string").gt(timestamp)
print (table.query(IndexName="my_datetime_string-index",
KeyConditionExpression=expr))
我在 table 中有一些数据并且可以看到它有一个字符串类型 (my_datetime_string
) -
{'Item': {'my_datetime_string': '2022-01-27 14:30:00', 'sk': 'HEAD', 'pk': 'EVENT#1293000'}, 'ResponseMetadata': {'RequestId': 'XXX', 'HTTPStatusCode': 200, 'HTTPHeaders': {'server': 'Server', 'date': 'Tue, 08 Feb 2022 10:54:15 GMT', 'content-type': 'application/x-amz-json-1.0', 'content-length': '522', 'connection': 'keep-alive', 'x-amzn-requestid': 'XXX', 'x-amz-crc32': '2080419831'}, 'RetryAttempts': 0}}
但我从查询中得到的只是 -
An error occurred (ValidationException) when calling the Query operation: Query key condition not supported
我在这里错过了什么? GSI 索引肯定支持 gt()
对 String
类型的查询吗? (或者可能不是??)
my_datetime_string
是您的索引的 Partition Key
(= Hash Key
)。 Query 必须提供 one-and-only-one Partition Key
值。这意味着 eq
在 Partition Key
条件下是有效的运算符,但 gt
不是。
如果您的 table/index 有 compound primary key, a query can apply a gt
operation to the Sort Key
(= Range Key
) condition, which will return a range 个值。
我正在尝试获取与 DynamoDB GSI 一起使用的 gt()
查询
我的Cloudformation如下-
Resources
MyTable:
Properties:
AttributeDefinitions:
- AttributeName: pk
AttributeType: S
- AttributeName: sk
AttributeType: S
- AttributeName: my_datetime_string
AttributeType: S
BillingMode: PAY_PER_REQUEST
GlobalSecondaryIndexes:
- IndexName: my_datetime_string-index
KeySchema:
- AttributeName: my_datetime_string
KeyType: HASH
Projection:
ProjectionType: ALL
KeySchema:
- AttributeName: pk
KeyType: HASH
- AttributeName: sk
KeyType: RANGE
TableName:
Fn::Sub: my-table-${AWS::StackName}-${AWS::Region}
Type: AWS::DynamoDB::Table
我的查询代码如下(python) -
tablename="whatever"
import boto3
table=boto3.resource("dynamodb").Table(tablename)
from datetime import datetime
timestamp="%s 00:00:00" % datetime.today().strftime("%Y-%m-%d")
from boto3.dynamodb.conditions import Key
expr=Key("my_datetime_string").gt(timestamp)
print (table.query(IndexName="my_datetime_string-index",
KeyConditionExpression=expr))
我在 table 中有一些数据并且可以看到它有一个字符串类型 (my_datetime_string
) -
{'Item': {'my_datetime_string': '2022-01-27 14:30:00', 'sk': 'HEAD', 'pk': 'EVENT#1293000'}, 'ResponseMetadata': {'RequestId': 'XXX', 'HTTPStatusCode': 200, 'HTTPHeaders': {'server': 'Server', 'date': 'Tue, 08 Feb 2022 10:54:15 GMT', 'content-type': 'application/x-amz-json-1.0', 'content-length': '522', 'connection': 'keep-alive', 'x-amzn-requestid': 'XXX', 'x-amz-crc32': '2080419831'}, 'RetryAttempts': 0}}
但我从查询中得到的只是 -
An error occurred (ValidationException) when calling the Query operation: Query key condition not supported
我在这里错过了什么? GSI 索引肯定支持 gt()
对 String
类型的查询吗? (或者可能不是??)
my_datetime_string
是您的索引的 Partition Key
(= Hash Key
)。 Query 必须提供 one-and-only-one Partition Key
值。这意味着 eq
在 Partition Key
条件下是有效的运算符,但 gt
不是。
如果您的 table/index 有 compound primary key, a query can apply a gt
operation to the Sort Key
(= Range Key
) condition, which will return a range 个值。