1

我对 DynamoDB 很陌生。我想查询一定时间范围内的所有数据。

column = "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 中的 Contains 方法。 html

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

我显然不完全理解。

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

4

1 回答 1

3

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

DynamoDB 是一个键/值数据库。您的查询通常针对单个键,可以选择使用排序键的一系列值。查询 name=A 和 X 和 Y 之间的时间戳是完美的,可以非常有效地查询。

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

  • 时间戳的 YYMMDD
  • 时间戳

现在,您可以查询时间戳在一定范围内的项目,不管name,但它们必须在同一 date。如果您需要此查询更广泛地工作,例如最多一个月的范围,那么您的 GSI 将有一个主键,它由以下各项组成:

  • 时间戳的YYMM
  • 时间戳

现在您可以查询同一个月内给定日期/时间范围内的所有项目。

以下是一些有用的资源:

于 2020-04-20T21:54:10.377 回答