处理 DynamoDB 查询结果的解析

Handling parsing of DynamoDB query result

假设我正在开发一个在 DynamoDB 中实现单一 table 设计的应用程序。 table 包含组织和用户,结果如下:

使用 AWS SDK,我能够针对我的 table 发出 QueryCommand,并通过 [=34] 检索我的组织(上图中的红色框)的所有信息和相关记录=] 像这样:

const params = {
  TableName: 'dynamo-table-name',
  KeyConditionExpression: '#PK = :PK',
  ExpressionAttributeNames: {
    '#PK': 'PK',
  },
  ExpressionAttributeValues: {
    ':PK': 'ORG#MICROSOFT',
  },
};

const result = await client.send(new QueryCommand(params));

由于我使用的是 @aws-sdk/lib-dynamodb 结果以 JS 对象数组的形式返回,这很好,但是我 运行 遇到了以下问题。获得这些数据后,我想执行以下操作:

转换为:

[
  {
    "PK": "ORG#MICROSOFT",
    "SK": "METADATA#MICROSOFT",
    "OrgName": "Microsoft",
    "PlanType": "Enterprise",
  },
  {
    "PK": "ORG#MICROSOFT",
    "SK": "USER#BILLGATES",
    "UserName": "Bill Gates",
    "UserType": "Member"
  },
  {
    "PK": "ORG#MICROSOFT",
    "SK": "USER#SATYANADELLA",
    "UserName": "Satya Nadella",
    "UserType": "Admin"
  }
]

像这样:

{
    "result": [
        {
            "OrgName": "Microsoft",
            "PlanType": "Enterprise",
            "Users": [
                {
                    "UserName": "Bill Gates",
                    "UserType": "Member"
                },
                {
                    "UserName": "Satya Nadella",
                    "UserType": "Admin"
                }
                
            ]
        }
    ]
}

我一直在努力寻找一个优雅的解决方案。到目前为止,我的尝试使用了 JavaScript 的 reduce 函数,但它们最终感觉不够强大,以至于我真的会考虑使用它。我的大部分问题都来自于这样一个事实,即如果我不仅要拥有组织的用户,而且还要拥有诸如位置之类的其他东西,我希望它也能工作。我也在寻找一些东西,在我搜索所有组织的情况下,它可以以所需的格式获取它们。有人对我如何做到这一点有什么建议吗?

这是解决此问题的方法。不确定它是否比您已经尝试过的有实质性改进。根据需要嵌入生成的 result 数组,例如{result}.

此代码对相同数据使用重复过滤器,因此虽然易于理解和修改,但对于大型数据集来说并不是最佳选择。

const records = [
  {
    PK: "ORG#MICROSOFT",
    SK: "METADATA#MICROSOFT",
    OrgName: "Microsoft",
    PlanType: "Enterprise",
  },
  {
    PK: "ORG#MICROSOFT",
    SK: "USER#BILLGATES",
    UserName: "Bill Gates",
    UserType: "Member",
  },
  {
    PK: "ORG#MICROSOFT",
    SK: "USER#SATYANADELLA",
    UserName: "Satya Nadella",
    UserType: "Admin",
  },
  {
    PK: "ORG#APPLE",
    SK: "METADATA#APPLE",
    OrgName: "Apple",
    PlanType: "Enterprise",
  },
  {
    PK: "ORG#APPLE",
    SK: "USER#TIMCOOK",
    UserName: "Tim Cook",
    UserType: "Admin",
  },
];

const orgs = records.filter((rec) => rec.OrgName);
const users = records.filter((rec) => rec.UserName);

const result = orgs.map((org) => ({
  OrgName: org.OrgName,
  PlanType: org.PlanType,
  Users: users
    .filter((user) => user.PK === org.PK)
    .map(({ UserName, UserType }) => ({ UserName, UserType })),
}));
console.log(result);