处理 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);
假设我正在开发一个在 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);