Как исключить дескрипторы типов данных, возвращаемые запросом DynamoDB QueryRequest?

Я изучаю DynamoDB и пытаюсь выполнить запрос с помощью .NET SDK для AWS. Я установил QueryRequest с определенным KeyConditionExpression, чтобы я мог искать по ключу раздела.

        var request = new QueryRequest
        {
            TableName = "MyTable",
            KeyConditionExpression = "ControlNumber = :cn",
            ExpressionAttributeValues =
                new Dictionary<string, AttributeValue> {{":cn", new AttributeValue { S = "123456789" } }}
        };

        var response = await client.QueryAsync(request);

Мне возвращают ту запись, которую я ищу, со всеми атрибутами. Все атрибуты в моей таблице DynamoDB определены как строки. Я получаю такие данные:

{
  "scannedCount": 5,
  "count": 2,
  "lastEvaluatedKey": null,
  "consumedCapacity": null,
  "items": [
    {
      "Status": {
        "nullvalue": null,
        "ss": null,
        "b": null,
        "bool": null,
        "ns": null,
        "l": null,
        "m": null,
        "n": null,
        "bs": null,
        "s": "READY"
      },
      "Type": {
        "nullvalue": null,
        "ss": null,
        "b": null,
        "bool": null,
        "ns": null,
        "l": null,
        "m": null,
        "n": null,
        "bs": null,
        "s": "OrderStatus"
      },  ......

Похоже, я получаю значение для всех возможных типов данных, которые могут быть возвращены, в дополнение к моей строке «s». Я думаю, что они называются дескрипторами типов данных, и все они равны нулю, за исключением строкового типа данных, который содержит данные, которые я действительно хочу видеть. Почему это? И как мне вернуть только данные, без всех тех нулевых значений, которые меня не волнуют.

Например, я ожидаю увидеть:

{ "Status": "Ready", "Type":"OrderStatus"....}

ОБНОВЛЕНИЕ: я могу запустить аналогичный запрос или даже получить элемент через интерфейс командной строки AWS и вернуть json, как я ожидал. Таким образом, похоже, что .NET SDK добавляет дополнительные дескрипторы типов данных, которые я не хочу видеть. Кроме того, я использую Mulesoft 4, и он делает то же самое, что и .NET SDK.


person ScottG    schedule 20.06.2019    source источник
comment
Я не использую .Net SDK, но помогает ли Document Model? См. docs.aws.amazon.com/amazondynamodveloperguide/latest/latest/ /   -  person jarmod    schedule 20.06.2019


Ответы (1)


Вот как это работает, если вы используете модель документа.

Если вы посмотрите на их пример здесь, то увидите, что они печатают все значения, вызывая «PrintDocument». Глядя на этот код, он просматривает и печатает каждый атрибут и значение.

    private static void PrintDocument(Document document)
    {
        //   count++;
        Console.WriteLine();
        foreach (var attribute in document.GetAttributeNames())
        {
            string stringValue = null;
            var value = document[attribute];
            if (value is Primitive)
                stringValue = value.AsPrimitive().Value.ToString();
            else if (value is PrimitiveList)
                stringValue = string.Join(",", (from primitive
                                in value.AsPrimitiveList().Entries
                                                select primitive.Value).ToArray());
            Console.WriteLine("{0} - {1}", attribute, stringValue);
        }
    }

Если вы хотите продолжить этот путь, вам нужно будет создать собственное отображение, чтобы справиться с этим. Итак, предполагая, что у нас есть объект InventoryItem, который состоит из статуса и типа (для простоты в виде строк), у вас будет такая функция сопоставления:

private InventoryItem Map(Dictionary<string, AttributeValue> result)
{
    return new InventoryItem
    {
        Id = Convert.ToInt32(result["Id"].N),
        Status = result["Status"].S,
        Type = result["Type"].S
    };
}

Похоже, вы хотите использовать модель сохраняемости объекта. Благодаря этому вы сможете создавать классы, которые сопоставляются с вашей таблицей DynamoDB, и вы можете легко выполнять запросы, приводящие к объектам.

Итак, на их примере вы создадите такую ​​модель:

[DynamoDBTable("Inventory")]
  public class InventoryItem
  {
    [DynamoDBHashKey]   
    public int Id { get; set; }

    public string Status{ get; set; }
    public string Type{ get; set; }   
  }

И получить этот предмет? Что ж, вам просто нужно сделать это:

 InventoryItem inventoryItem = context.Load<InventoryItem>("123456789");

Мне этот способ больше нравится. С ним нельзя делать столько операций, но он больше похож на ORM Django, к которому я привык.

Надеюсь это поможет!

person TrialAndError    schedule 21.06.2019