Упорядочение результатов по ключу диапазона в DynamoDB не работает - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть определение таблицы, подобное следующему:

    ATTRIBUTE_NAME, ATTRIBUTE_TYPE = 'AttributeName', 'AttributeType'
    my_table = dynamodb.create_table(
    TableName='my_table',
    KeySchema=[
        {
            ATTRIBUTE_NAME: 'order_id',
            'KeyType': 'HASH'
        },
        {
            ATTRIBUTE_NAME: 'time',
            'KeyType': 'RANGE'
        }
    ],
    AttributeDefinitions=[
        {
            ATTRIBUTE_NAME: 'order_id',
            ATTRIBUTE_TYPE: 'S'
        },
        {
            ATTRIBUTE_NAME: 'time',
            ATTRIBUTE_TYPE: 'S'
        },
        {
            ATTRIBUTE_NAME: 'market_product',
            ATTRIBUTE_TYPE: 'S'
        }
    ],
    GlobalSecondaryIndexes=[
        {
            'IndexName': 'market_product_index',
            'KeySchema': [
                {
                    'AttributeName': 'market_product',
                    'KeyType': 'HASH'
                },
            ],
            'Projection': {
                'ProjectionType': 'KEYS_ONLY'
            },
            'ProvisionedThroughput': {
                'ReadCapacityUnits': 5,
                'WriteCapacityUnits': 5
            }
        }
    ],
    ProvisionedThroughput={
        'ReadCapacityUnits': 5,
        'WriteCapacityUnits': 5
    }
    )

Здесь я создаю фиктивные данные для этой таблицы:

from uuid import uuid4 as uuid

my_table_dummy = [
    {
        'order_id': str(uuid()),
        'time': '2019-02-13 15:07:55.575960',
        'market_product': 'bitmex:BTC-USD',
        'side': 'buy',
        'size': '10.2',
        'weighted_price': '21.3'
    },
    {
        'order_id': str(uuid()),
        'time': '2019-02-13 15:06:55.575960',
        'market_product': 'bitmex:BTC-USD',
        'side': 'buy',
        'size': '10.2',
        'weighted_price': '21.3'
    },
    {
        'order_id': str(uuid()),
        'time': '2019-02-12 15:06:55.575960',
        'market_product': 'bitmex:BTC-USD',
        'side': 'buy',
        'size': '10.2',
        'weighted_price': '21.3'
    },
    {
        'order_id': str(uuid()),
        'time': '2019-02-12 15:06:55.575961',
        'market_product': 'bitmex:BTC-USD',
        'side': 'buy',
        'size': '10.2',
        'weighted_price': '21.3'
    },
    {
        'order_id': str(uuid()),
        'time': '2019-02-11 15:06:55.575960',
        'market_product': 'bitmex:BTC-USD',
        'side': 'buy',
        'size': '10.2',
        'weighted_price': '21.3'
    }
]

for dummy_sample in my_table_dummy:
    my_table.put_item(Item=dummy_sample)

Я читаю это, когда кто-то запрашивает вышеуказанное и использует ScanForwardIndex, то результаты сортируются по ключу диапазона, который в данном случае равен time.Однако я не получаю предполагаемого поведения получения результатов запроса в порядке убывания / возрастания по атрибуту time:

response = my_table.query(
    IndexName='market_product_index',
    KeyConditionExpression=Key('market_product').eq('bitmex:BTC-USD'),
    ScanIndexForward=True
)

, и ответ выглядит следующим образом, т.е. не упорядочен по времени вообще:

{'Items': [{'market_product': 'bitmex:BTC-USD',
   'order_id': '0d9fd701-5a7e-4348-bb01-631388c2c246',
   'time': '2019-02-12 15:06:55.575960'},
  {'market_product': 'bitmex:BTC-USD',
   'order_id': '8cc1f2a2-0bc5-4169-aca5-cf37abbb5bc4',
   'time': '2019-02-11 15:06:55.575960'},
  {'market_product': 'bitmex:BTC-USD',
   'order_id': 'd23cfa2c-9ae6-403b-ae57-1e1a3796e116',
   'time': '2019-02-13 15:06:55.575960'},
  {'market_product': 'bitmex:BTC-USD',
   'order_id': '29095ee3-588f-4fb8-98a0-ce34adf028ea',
   'time': '2019-02-12 15:06:55.575961'},
  {'market_product': 'bitmex:BTC-USD',
   'order_id': '6cacd8fa-a2d0-4f2d-8041-a30fa5252c3b',
   'time': '2019-02-13 15:07:55.575960'}],
 'Count': 5,
 'ScannedCount': 5,
 'ResponseMetadata': {'RequestId': 'bbc8bc0e-218a-4669-ba52-4ac07cc7bb60',
  'HTTPStatusCode': 200,
  'HTTPHeaders': {'content-type': 'application/x-amz-json-1.0',
   'x-amz-crc32': '365619475',
   'x-amzn-requestid': 'bbc8bc0e-218a-4669-ba52-4ac07cc7bb60',
   'content-length': '738',
   'server': 'Jetty(8.1.12.v20130726)'},
  'RetryAttempts': 0}}

1 Ответ

0 голосов
/ 13 февраля 2019

Они возвращаются в произвольном порядке, потому что у вашего индекса нет ключа сортировки.Индексы не наследуют автоматически какую-либо структуру из базовой таблицы.

Выбирая только ключи, вы говорите DynamoDB, что первичный ключ таблицы должен быть спроецирован на GSI, но DynamoDB не будет предполагать, что вы хотите, чтобы ваш GSI был отсортирован по тому же атрибуту.

Это можно исправить, удалив и заново создав GSI с отметкой времени в качестве ключа сортировки GSI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...