Запрос DynamoDB не возвращает все атрибуты - PullRequest
0 голосов
/ 11 марта 2020

У меня есть таблица в DynamoDB.

Table name  test-vod
Primary partition key   guid (String)
Primary sort key    -

С дополнительными атрибутами, как вы можете видеть ниже.

DB_Columns_1 DB_Columns_2

Цель состоит в том, чтобы запросить таблицу, используя один из столбцов, не являющихся первичным ключом srcVideo, для достижения sh того, что мы создали второй локальный индекс.

DB_Indexes

И используя низкоуровневый API из пакета DynamoDB SDK NuGet, мы запрашиваем следующий код (открытый для других параметров вместо низкоуровневого API).

var queryRequest = new QueryRequest
            {
                TableName = $"{_environmentName}-vod",
                IndexName = "srcVideo-index",
                ScanIndexForward = true,
                KeyConditionExpression = "srcVideo = :v_srcVideo",
                ExpressionAttributeValues = new Dictionary<string, AttributeValue>()
                {
                    {":v_srcVideo",new AttributeValue {S = inputMediaKey}}
                }
            };

            var response = await _client.QueryAsync(queryRequest, cancellationToken);

            // Does not exist
            var hlsUrl = response.Items
                .SelectMany(p => p)
                .SingleOrDefault(p => p.Key.Equals("hlsUrl"));

Мне интересно получить 3 атрибута (поля) из ответа hlsUrl, dashUrl, workflowsStatus, но все 3 отсутствуют, ответ содержит словарь с количеством ключей 27, это только 27 из 35 доступных столбцов.

Attributes_Response

Я пытался использовать ProjectionExpression и другие комбинации запросов, но безуспешно.

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Вы не показываете CREATE TABLE, который вы использовали ...

Похоже, ваш индекс не был создан с атрибутом Projection, который вам действительно нужен ...

По умолчанию KEYS_ONLY. Звучит так, будто вы хотите ALL или, может быть, INCLUDE только выбранные атрибуты ... GlobalSecondaryIndex - проекция

Локальные вторичные индексы работают так же ...

0 голосов
/ 12 марта 2020

Интересно, но я заставил его работать с приведенным ниже кодом, даже если ключ / значение не присутствует в словаре при проверке отладчика, вы все равно можете его извлечь.

var queryRequest = new QueryRequest
            {
                TableName = tableName,
                IndexName = "srcVideo-index",
                ScanIndexForward = true,
                KeyConditionExpression = "srcVideo = :v_srcVideo",
                ExpressionAttributeValues = new Dictionary<string, AttributeValue>()
                {
                    {":v_srcVideo", new AttributeValue {S = inputMediaKey}}
                }
            };

            var response = await _client.QueryAsync(queryRequest, cancellationToken);

            if (response.Items.AnyAndNotNull())
            {
                var dictionary = response.Items.First().ToDictionary(p => p.Key, x => x.Value.S);

                return Result.Ok (new VodDataInfo(
                    dictionary["srcBucket"],
                    dictionary["srcVideo"],
                    dictionary["destBucket"],
                    dictionary.ContainsKey("dashUrl") 
                        ? dictionary["dashUrl"] 
                        : default,
                    dictionary.ContainsKey("hlsUrl") 
                        ? dictionary["hlsUrl"] 
                        : default,
                    dictionary["workflowStatus"]));
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...