Как вернуть самую большую отметку времени для ключа сортировки из таблицы DynaModb с помощью API Go?

avatar
Ryan
8 августа 2021 в 22:58
207
1
1

У меня есть такая структура таблицы:

столбец тип
пузырьковый идентификатор Строка
bubbleLastUpdated Строка
... ...

bubbleId — мой первичный ключ, а bubbleLastUpdated — мой ключ сортировки

Многоточия(...) представляют остальные данные в структуре, которые не относятся к этому вопросу.

По возможности, используя построитель выражений, как следует построить объект QueryInput, чтобы возвращалось наибольшее значение для bubbleLastUpdated?

Я использую в своем объекте QueryInput следующее:

    results, err := d.dynamoClient.Query(&dynamodb.QueryInput{
        TableName: aws.String(tableName),
        ScanIndexForward: aws.Bool(false),
        Limit: aws.Int64(1),
    })

Конечно, это возвращает ошибку, говорящую о том, что в запросе должен быть параметр KeyConditionExpression. Я немного знаком с построителем ключевых выражений, но я не хочу на самом деле предоставлять для них условные выражения. К сожалению, после долгих поисков я оказался здесь. Я либо ищу не то, либо упускаю что-то простое.

Пример был бы очень полезен.

Спасибо!

Источник

Ответы (1)

avatar
Salil
9 августа 2021 в 02:24
1

То, что вы называете первичным ключом, на самом деле называется ключом раздела. Вы должны указать хотя бы ключ раздела, чтобы иметь возможность использовать query.

Если у вас нет ключа раздела, вы можете использовать scan, но это неэффективно, и вам следует рассмотреть возможность изменения дизайна таблицы или добавления global secondary index (gsi).

Вы можете использовать ключ секции в запросе следующим образом:

    var queryInput = &dynamodb.QueryInput{
        TableName:        aws.String(tableName),
        ScanIndexForward: aws.Bool(false),
        Limit:            aws.Int64(1),
        KeyConditions: map[string]*dynamodb.Condition{
            "bubbleId": {
                ComparisonOperator: aws.String("EQ"),
                AttributeValueList: []*dynamodb.AttributeValue{
                    {
                        S: aws.String("bubbleId"),
                    },
                },
            },
        },
    }

    var resp, err = d.dynamoClient.Query(queryInput)
    if err != nil {
        return nil, err
    }
Ryan
9 августа 2021 в 03:13
0

Спасибо за столь быстрый ответ, я думаю, что неправильно думал о «ключе раздела». Например, вместо того, чтобы иметь таблицу для нескольких зоопарков, содержащих всех их животных. У меня должна быть одна таблица с «зоопарком» в качестве ключа раздела, который разделит всех животных. И скажем, дата - это последнее кормление каждого животного. Тогда я мог бы запросить последнее кормление любого зоопарка.

mh-cbon
9 августа 2021 в 09:31
0

после нахождения связанного документа это имело смысл docs.aws.amazon.com/amazondynamodb/latest/developerguide/…