dynamodb updateitem delete from set

aws 26 de jul. de 2020

pues resulta que en dynamodb no existe la facilidad para borrar cosas por valor cuando estos valores están en un set (que no es un arreglo) de un tipo distinto a string, binary o number... es decir: Map (o sub documento json)...

digamos que si yo tengo esto:

{
  "id": 1,
  "name": "tree",
  "products": [
    {
      "seeds": false,
      "fruits": true,
      "wood": false
    },
    {
      "seeds": false,
      "fruits": false,
      "wood": false
    },
    {
      "seeds": false,
      "fruits": true,
      "wood": true
    }
  ]
}

y quiero borrar todos los productos de un arbol cuya propiedad sea wood=false, tendría que ejecutar un Query que me trajera el Id y todos los products de cada Id, después guardar los índices de cada propiedad donde la madera e "falsa", concatenar los índices en una cadena y utilizar remove. Algo más o menos así:

const params = {
          TableName: 'trees-table-dev",
          Key: {"id": 1},
          ProjectionExpression: "products"
        }
        const arbolData = await dynamodb.get(getEmpParams).promise();

        for(let i = 0; i < arbolData.Item.products.length; i++){
          if(arbolData.Item.products[i].wood === false)
          {
            break; //para dejar el contador i en el índice a borrar
          }
        }
        
        //validar que se haya encontrado un árbol wood=false
        
        if(i < arbolData.Item.products.length){ 
            const updateParams = {
                TableName: 'trees-table-dev",
                Key: {"id": 1},
                //borrar el índice completo del set.
                UpdateExpression: `REMOVE products[${i}]`,
            }
            
            await dynamodb.update(updateStoreParams).promise();
        }

todo eso tuve qué hacer para borrar un índice del set.

se suponía que debería funcionar por valor cuando se trata de sets de un solo tipo, como strings, números o boleanos (ojo, donde es un equivalente a new int []) pero resulta que hay un bug en npm que hace que falle.

lo anterior muy seguramente obedece a un diseño arquitectónico no totalmente apto para dynamodb, y muy probablemente eso tenga que casi todos mis años de experiencia son en bases de datos relacionales, y que debería cambiar desde la arquitectura... pero ni modo, poco a poco.

si alguien sabe hacer lo anterior en un solo comando, hágamelo saber

Etiquetas