es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo actualizar datos de una lista anidada en DynamoDB utilizando la pila de servidor sin servidor?

Tengo una tabla de dynamoDB que tiene un Elemento que incluye un usuario y una lista de planes. Se ve así:

Item: 
{
    user: 'abc123',
    plans: [
        {
            id: 1,
            name: 'movies',
            category: 'category',
            price: 200,
        },
        {
            id: 2,
            name: 'fishing',
            category: 'category2',
            price: 400,
        }
    ]
}

Ahora, quiero actualizar solo el objeto (nombre, categoría, precio) de id:2 en la lista. Entonces escribí el controlador a continuación. Y hay un error “edit error ValidationException: La ruta del documento proporcionada en la expresión de actualización no es válida para actualizar” en CloudWatch.

export const processAddPlan = async (event: APIGatewayEvent) => {
  const data = JSON.parse(event.body)
  const { store, id } = event.queryStringParameters

  const params = {
    TableName: usersTable,
    Key: {
      store: store,
      id: id,
    },
    UpdateExpression: 'SET #pl[1] = :plans',
    ExpressionAttributeNames: {
      '#pl': 'plans',
    },
    ExpressionAttributeValues: {
      ':plans': [
        {
          'name': data.planName,
          'category': data.planCategory,
          'price': data.planPrice,
        },
      ],
    },
    ReturnValues: 'UPDATED_NEW',
  }

  log.info('params', params)

  await dynamoDb.update(params).catch(e => log.info('edit error', e))

  return success('edit plan succeeded')
}

Establecí los parámetros de consulta y probé (envié) a través de Postman de esta manera.

{
    "plans":[
        {"planName":"ga2new",
         "planCategory": "ttnew",
         "planPrice": 5675
        }
    ]
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el código del controlador es que el UpdateExpression está intentando actualizar todo el atributo “plans” con una nueva lista que solo contiene el plan con el id 2. En su lugar, necesitas actualizar solo los atributos específicos para el plan con el id 2.

    Para hacer esto, puedes utilizar el índice del elemento que deseas actualizar en la lista de “plans”. Así es como puedes modificar el código del controlador:

    export const processAddPlan = async (event:APIGatewayEvent) => {
    
      const data = JSON.parse(event.body)
      const { store, id } = event.queryStringParameters
    
      const params = {
        TableName: usersTable,
        Key: {
          store: store,
          id: id,
        },
        UpdateExpression: 'SET #pl[1].#name = :name, #pl[1].#category = :category, #pl[1].#price = :price',
        ExpressionAttributeNames: {
          '#pl' : 'plans',
          '#name': 'name',
          '#category': 'category',
          '#price': 'price'
        },
        ExpressionAttributeValues: {
          ':name': data.planName,
          ':category': data.planCategory,
          ':price': data.planPrice
        },
        ReturnValues: 'UPDATED_NEW',
      }
    
      log.info('params', params)
    
      await dynamoDb.update(params).catch(e => log.info('edit error', e))
    
      return success('edit plan succeeded')
    }
    

    Como puedes ver, la expresión #pl[1] se utiliza para acceder al segundo elemento (el plan con el id 2) en la lista de “plans”. Luego, utilizamos .#name, .#category y .#price para referirnos a los atributos específicos que deben ser actualizados. Finalmente, utilizamos el parámetro ExpressionAttributeValues para proporcionar los valores actualizados para estos atributos.

    Con este código actualizado, deberías poder actualizar correctamente los atributos requeridos para el plan con el id 2.

Comments are closed.