Запросить все данные в DynamoDB без использования первичного ключа раздела - PullRequest
1 голос
/ 20 апреля 2020

Я очень новичок в 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: После поиска по inte rnet я обнаружил, что вам нужен первичный ключ раздела внутри вашего запроса, поэтому я попробовал метод Contains из 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]?

1 Ответ

2 голосов
/ 21 апреля 2020

Вы не можете легко решить эту проблему в DynamoDB, по крайней мере, в общем случае, который позволил бы вам сделать один запрос и только один запрос, чтобы получить все записи в произвольном диапазоне дат независимо от name (ключ раздела).

DynamoDB - это база данных ключ / значение. Ваши запросы обычно относятся к отдельным ключам, возможно с диапазоном значений для ключа сортировки. Запрос имени = A и отметки времени между X и Y является совершенным и может быть очень эффективно запрошен.

Чтобы сделать то, что вы хотите, вы обычно создаете глобальный вторичный индекс, первичный ключ которого состоит из:

  • ГГММДД отметки времени
  • отметка времени

Теперь вы можете запрашивать элементы с отметкой времени в определенном диапазоне, независимо от name, но они должны быть в тот же день . Если вам нужен этот запрос для более широкой работы, скажем, с диапазонами до месяца, то у вашего GSI будет первичный ключ, который будет составным из:

  • ГГММ отметки времени
  • отметка времени

И теперь вы можете запрашивать все элементы в пределах заданного диапазона дат / времени в одном и том же месяце.

Вот несколько полезных ресурсов:

...