Recientemente me encontré con un problema en el que tenía que almacenar una colección de datos dentro de un atributo. Hay una tabla de restaurantDB. La tabla tiene un atributo (no obligatorio) llamado "grupos" que gestiona los grupos creados por el restaurante. Estos grupos tienen varios permisos asociados a ellos. Una forma natural de pensar es que el atributo de grupos puede ser del tipo lista que almacena un mapa (pares clave-valor) de los datos como nombre_grupo, id_grupo y permiso (que es una lista de todos los permisos)
table:{ //other fields id: groups: L: M: {group_name:S,group_id:S,permission:L :S} }p.ej
"groups": [{ "name": "OWNER", "permission": ["READ", "WRITE"] }, { "name": "MANAGER", "permission": ["READ"], } ], Esto funciona bien para la creación y adición de un número arbitrario de usuarios mediante la actualización de dynamoDB aws-sdk con update UpdateExpression: 'SET #groups:=list_append(#groups,:newgroup)'
sin embargo, si tengo que hacer una solicitud de parche para modificar un permiso para un grupo, digamos, MANAGER , ¿Cómo puedo recuperar el objeto Mapa dentro de la lista con la clave group_name : "MANAGER" sin obtener toda la matriz de Grupos?
No quiero parchearlo obteniendo la lista completa porque primero tendré que query para obtener el atributo de grupos, luego tendré que recorrer toda la matriz para encontrar group_name:"MANAGER" . Una vez que lo consiga, modificaré la matriz y luego volveré a colocar la lista completa con una update .
Se garantiza que los nombres de los grupos sean únicos (sin embargo, el cliente también quiere un group_id único), así que pensé en una estructura de datos como
table:{ //other fields id: groups: M:{S:L} }p.ej
"groups":{ "OWNER":["READ","WRITE"], "MANAGER":["READ"] }Aunque ahora no puedo ingresar una cantidad arbitraria de datos para crear un nuevo grupo (como en la solicitud POST), pero puedo hacerlo uno a la vez. También la solicitud PATCH ahora funciona bien como
UpdateExpression: "set #groups.#groupName = :newPermission", ExpressionAttributeNames: { "#groups": "groups", "#groupName": `${groupName}`, //groupName taken from request Body }, ExpressionAttributeValues: { ":newPermission": permission, //permission taken from request body },Quería saber si había una mejor manera de recuperar tipos de lista. La documentación syas podemos recuperar elementos de la lista con índices, sin embargo, no conozco el índice de antemano.