Supongamos que estoy trabajando en una aplicación que implementa el diseño de una sola tabla en DynamoDB. La tabla contiene organizaciones y usuarios, lo que da como resultado algo como esto:
Con el SDK de AWS , puedo emitir un QueryCommand en mi tabla y recuperar toda la información y los registros relacionados con mi organización (el cuadro rojo en la imagen de arriba) ejecutando algo como esto:
const params = { TableName: 'dynamo-table-name', KeyConditionExpression: '#PK = :PK', ExpressionAttributeNames: { '#PK': 'PK', }, ExpressionAttributeValues: { ':PK': 'ORG#MICROSOFT', }, }; const result = await client.send(new QueryCommand(params)); Dado que estoy usando @aws-sdk/lib-dynamodb el resultado vuelve como una matriz de objetos JS, lo cual es bueno, pero me encuentro con el siguiente problema. Una vez que tenga esos datos, me gustaría hacer lo siguiente:
Convierte esto:
[ { "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" } ]A algo como esto:
{ "result": [ { "OrgName": "Microsoft", "PlanType": "Enterprise", "Users": [ { "UserName": "Bill Gates", "UserType": "Member" }, { "UserName": "Satya Nadella", "UserType": "Admin" } ] } ] }He luchado para encontrar una solución elegante. Mis intentos hasta este punto hicieron uso de la función de reducción de JavaScript, pero nunca terminaron sintiéndose lo suficientemente robustos como para ser algo que realmente consideraría usar. La mayoría de mis problemas provienen del hecho de que me gustaría que también funcionara si tuviera no solo usuarios para una organización, sino también algo más, como tal vez ubicaciones. También estoy buscando algo que, en el caso de que busque todas las organizaciones, pueda obtenerlas en el formato deseado. ¿Alguien tiene alguna sugerencia sobre cómo podría hacer esto?
Aquí hay una idea de cómo resolver esto. No estoy seguro si mejora sustancialmente sobre lo que ya has probado. Incruste la matriz de result resultante según sea necesario, por ejemplo, {result} .
Este código usa filtros repetidos sobre los mismos datos, por lo que, si bien es fácil de entender y modificar, no es óptimo para un gran conjunto de datos.
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);