DynamoDB: Как добраться до вложенного объекта по id? - PullRequest
0 голосов
/ 14 января 2019

У меня есть две таблицы в моей DynamoDB:

[DynamoDBTable("TVShow")]
public class TVShow
{
    [DynamoDBHashKey]
    public string Id { get; set; }

    [DynamoDBRangeKey]
    public long Timestamp { get; set; }

    [DynamoDBProperty]
    public string Title { get; set; }

    [DynamoDBProperty]
    public double Rate { get; set; }

    [DynamoDBProperty("Episodes")]
    public List<Episode> Episodes { get; set; }
}

[DynamoDBTable("Episode")]
public class Episode
{
    [DynamoDBHashKey]
    public string Id { get; set; }

    [DynamoDBRangeKey]
    public long Timestamp { get; set; }

    [DynamoDBProperty]
    public string Title { get; set; }
}

Пример данных:

{
  "Episodes": {
    "L": [
      {
        "M": {
          "Id": {
            "S": "8ab47e73-188c-43e5-8010-1e22a982bb28"
          },
          "Timestamp": {
            "N": "636830978394004950"
          },
          "Title": {
            "S": "First Episode"
          }
        }
      },
      {
        "M": {
          "Id": {
            "S": "c477e288-37d1-4d7f-9104-9b72ed304808"
          },
          "Timestamp": {
            "N": "636830978394669182"
          },
          "Title": {
            "S": "Second Episode"
          }
        }
      }
    ]
  },
  "Id": {
    "S": "466d8a18-f998-49b3-a299-90b508dba045"
  },
  "Rate": {
    "N": "9.3"
  },
  "Timestamp": {
    "N": "636830978390056778"
  },
  "Title": {
    "S": "Vikings"
  }
}

Id: HASH | Ключ перегородки

Метка времени: RANGE | Ключ сортировки

И я хочу получить вложенный объект «Эпизод первый» TVShow по идентификатору [Эпизод].

Я пробовал много способов получить данные. Но не сработало. Это мои источники. Эти документы не актуальны. Я использую пакет nuget AWSSDK.DynamoDBv2 v3.3.16.5.

Запрос таблиц и индексов: .NET https://docs.aws.amazon.com/en_us/amazondynamodb/latest/developerguide/LowLevelDotNetQuerying.html

Сканирование таблиц и индексов: .NET https://docs.aws.amazon.com/en_us/amazondynamodb/latest/developerguide/LowLevelDotNetScanning.html

// I can get the TVShow by Id with this.
var scanRequest = new ScanRequest(nameof(TVShow))
{
    FilterExpression = "Id = :Id",
    ExpressionAttributeValues = new Dictionary<string, AttributeValue>
    {
        {":Id", new AttributeValue {S = "466d8a18-f998-49b3-a299-90b508dba045"}}
    }
};

// In the document scan is not async but in v3.3.16.5 scan is async.
var scanResponse = await Client.ScanAsync(scanRequest);


// I can get the TVShow by Id with this.
var queryRequest = new QueryRequest(nameof(TVShow))
{
    KeyConditionExpression = "Id = :Id",
    ExpressionAttributeValues = new Dictionary<string, AttributeValue>
    {
        {":Id", new AttributeValue {S = "466d8a18-f998-49b3-a299-90b508dba045"}}
    }
};

// In the document query is not async but in v3.3.16.5 query is async.
var queryResponse = await Client.QueryAsync(queryRequest);

Здесь все в порядке. Но, как я уже сказал, я хочу фильтровать по идентификатору вложенного объекта или другому полю, например, заголовку. Каков наилучший способ для этого? Если это возможно как класс таблицы.

...