Элемент атрибута списка отображения DynamoDB по запросу - PullRequest
1 голос
/ 21 сентября 2019

Есть ли способ преобразовать выходные данные запроса DynamoDB (используя doc-client в Lambda) во время процесса запроса.В частности, я хочу извлечь первый элемент списка и поместить его в новый атрибут.

В качестве упрощенного примера DynamoDB имеет следующие записи:

{
    "Id": 1
    "Items": [ "item-1", "item-2", "item-3" ]
},
{
    "Id": 2,
    "Items": [ "item-x" ]
},
{
    "Id": 3,
    // "Items" is potentially optional
}

И используя следующиеЛямбда-функция:

// ...

exports.handler = async (event, context) => {
    return dynamoDoc.query({
        TableName                 : 'some-table',
        Select                    : 'SPECIFIC_ATTRIBUTES',
        KeyConditionExpression    : 'Id = :id',
        ExpressionAttributeValues : {
            ':id' : event.Id,
        },
        ProjectionExpression : `
            Id,
            Items[0]
        `,
    }).promise();
};

Однако это возвращает список с элементами, которые выглядят следующим образом:

"Items": [
    {
        "Id": 1,
        "Items": [
            "item-1"
        ]
    },
    {
        "Id": 2,
        "Items": [
            "item-x"
        ]
    },
    {
        "Id": 3
    }
]

Есть ли способ переназначить имена атрибутов, используя какое-то выражение, чтобы я могполучить вывод данных в виде:

Items: [
    {
        "Id": 1,
        "FirstItem: "item-1"
    },
    {
        "Id": 2,
        "FirstItem: "item-x"
    },
    {
        "Id": 3
    }
]

В настоящее время я использую массив array.forEach в Javascript для данных позже, однако я пытаюсь избежать этого и предпочел бы использовать DynamoDB для этого вычисления.

1 Ответ

1 голос
/ 23 сентября 2019

Ни за что.

Лучше всего просто создать вспомогательную функцию, например Repository, вспомогательная функция перенесет весь запрос в Dynamodb и вернет объект final для функции-обработчика.

Быстрое исправление, используйте .map вместо .forEach

exports.handler = async (event, context) => {
  const result = await dynamoDoc.query({
    TableName: 'some-table',
    Select: 'SPECIFIC_ATTRIBUTES',
    KeyConditionExpression: 'Id = :id',
    ExpressionAttributeValues: {
      ':id': event.Id,
    },
    ProjectionExpression: `
            Id,
            Items[0]
        `,
  }).promise();

  result.Items = result.Items.map((i) => {
    return {
      Id: i.Id,
      FirstItem: i.Items && i.Items.length ? i.Items[0] : undefined,
    }
  });

  return result; // final result
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...