繁体   English   中英

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

[英]Query all data in DynamoDB without using primary partition key

我对 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.html

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

我显然不完全理解。

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

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

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

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

  • 时间戳的 YYMMDD
  • 时间戳

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

  • 时间戳的 YYMM
  • 时间戳

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

以下是一些有用的资源:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM