【问题标题】:Query all data in DynamoDB without using primary partition key在不使用主分区键的情况下查询 DynamoDB 中的所有数据
【发布时间】:2020-04-20 08:30:40
【问题描述】:

我对 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 的 Contains 方法

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

我显然不完全理解。

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

【问题讨论】:

  • 我建议您观看一些来自 AWS 的 NoSQL DynamoDB 视频,了解这一切是如何在 DynamoDB 中完成的。
  • 在您的第一个查询中,您缺少分区键 (name)。在第二个查询中,您不能在单个查询中查询多个分区键值——分区键条件始终为equals,但排序键可以是一个范围。推荐阅读:dynamodbguide.com/querying
  • @jarmod 是的,我知道分区键需要相等。但我想得到所有的名字我怎么能 eq([all names]) ?

标签: python amazon-dynamodb boto3 amazon-dynamodb-data-modeling


【解决方案1】:

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

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

要做你想做的事,你通常会创建一个全局二级索引,其主键是以下各项的组合:

  • 时间戳的YYMMDD
  • 时间戳

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

  • 时间戳的YYMM
  • 时间戳

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

这里有一些有用的资源:

【讨论】:

    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多