【问题标题】:DynamoDB remap list attribute item on query查询时的 DynamoDB 重新映射列表属性项
【发布时间】:2019-09-21 20:19:25
【问题描述】:

有没有办法在查询过程中转换 DynamoDB 查询的输出(在 Lambda 中使用 doc-client)。具体来说,我希望提取列表的第一项并将其放入一个新属性中。

作为一个简化示例,DynamoDB 具有以下条目:

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

并使用以下 Lambda 函数:

// ...

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
    }
]

我目前在数据上使用 Javascript 的 array.forEach,但是,我试图避免这种情况,宁愿利用 DynamoDB 进行这种计算。

【问题讨论】:

    标签: javascript amazon-web-services amazon-dynamodb


    【解决方案1】:

    没办法。

    最佳做法是创建一个类似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
    };
    

    【讨论】:

    • 除非我弄错了,.forEach 仍然会更好(比 .map),因为它不会再次重新创建完整的结果结构(对象创建可以按毫秒计费)?不过,我想我会考虑制作一个包装器。
    猜你喜欢
    • 1970-01-01
    • 2017-01-15
    • 2011-06-13
    • 2019-05-03
    • 2018-09-24
    • 2018-02-17
    • 2021-06-30
    • 2017-03-13
    • 1970-01-01
    相关资源
    最近更新 更多