在不使用主分区键的情况下查询 DynamoDB 中的所有数据

Query all data in DynamoDB without using primary partition key

我是 DynamoDB 的新手。我想查询一定时间范围内的所有数据

列 = "timerange" 是主排序键
column = "name" 是主分区键。

我想获取2个时间范围内的所有数据。

这是我的查询。

from decimal import *
from boto3.dynamodb.conditions import Key, Attr
import boto3
import time
from datetime import datetime

dynamo = boto3.resource('dynamodb')
table = dynamo.Table('tablename')
a = time.mktime(datetime.strptime('2020-03-26 14:29:10','%Y-%m-%d %H:%M:%S').timetuple())
b = time.mktime(datetime.strptime('2020-03-26 14:30:10','%Y-%m-%d %H:%M:%S').timetuple())

response = table.query(
    KeyConditionExpression =
        Key('timerange').between(Decimal(a), Decimal(b)))

这给了我一个错误 ClientError: An error occurred (ValidationException) when calling the Query operation: Query condition missed key schema element: 在互联网上搜索后,我发现您需要在查询中包含主分区键 所以我尝试了 https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html

中的 Contains 方法
response = table.query(
    KeyConditionExpression =
        Key('name').contains('a', 'b') &
        Key('timerange').between(Decimal(a), Decimal(b)))

我显然没有完全理解。

如何获取给定时间范围 [a,b] 内的所有数据?

您无法在 DynamoDB 中轻松解决此类问题,至少在允许您进行一次查询且仅一次查询以获取任意日期范围内的所有记录的一般情况下,无论 name(分区键)。

DynamoDB 是一个 key/value 数据库。您的查询通常针对单个键,可选地使用排序键的一系列值。查询name=A和X,Y之间的时间戳就完美了,查询效率很高

要执行您想要的操作,您通常会创建一个全局二级索引,其主键是以下各项的组合:

  • 时间戳的 YYMMDD
  • 时间戳

现在,您可以查询时间戳在一定范围内的项目,与name无关,但它们必须在同一日期。如果您需要此查询更广泛地工作,比如说最多一个月的范围,那么您的 GSI 将有一个主键,它是以下内容的组合:

  • 时间戳的 YYMM
  • 时间戳

现在您可以查询同一个月dates/times给定范围内的所有项目。

这里有一些有用的资源: