Как исключить дескрипторы типов данных, возвращенные из DynamoDB QueryRequest? - PullRequest
0 голосов
/ 20 июня 2019

Я изучаю 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"....}

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

1 Ответ

1 голос
/ 22 июня 2019

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

Если вы посмотрите на их пример здесь , вы увидите, что они печатают все значения, вызывая "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, к которому я привык.

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

...