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.

Explorar / consultar entradas específicas en una tabla de dynamodb con lambda.

Estoy trabajando con AWS y usando una API para disparar una función lambda que contiene código CRUD para DynamoDB. Por ejemplo, este fragmento de código (en la función lambda) escanea y devuelve todos los objetos:

app.get(path, function (req, res) {
  var params = {
    TableName: tableName,
    Select: 'ALL_ATTRIBUTES',
  };

  dynamodb.scan(params, (err, data) => {
    if (err) {
      res.json({ error: 'Could not load items: ' + err.message });
    }

    res.json({
      data: data.Items.map(item => {
        return item;
      }),
    });
  });
});

Esto funciona bien y lo he estado probando con Postman. Ahora quiero consultar todos los elementos que coincidan con un ID específico de una tabla que no es la clave de partición. Por ejemplo: Imagina que tengo una base de datos que contiene libros. La clave de partición es el nombre del libro. También hay un atributo que es el año del libro. Varios libros pueden tener el año del libro 1997. Y ahora quiero editar mi consulta/escaneo para que encuentre y me devuelva todos los libros con el año del libro 1997. ¿Cuál sería la mejor manera de hacer esto? Gracias de antemano.

Edición nr 100:
Ahora estoy usando este código:

Lo cual es genial, ¡porque la consulta ahora funciona! El json.tringify(data) me da los 2 elementos de la base de datos que quería, ¡lo cual es genial! Ahora estoy tratando de devolver esto a mi situación de prueba en Postman. Pero desafortunadamente recibo un “mensaje”: “Error interno del servidor”. Así que no creo que devolver data.Items sea del todo correcto.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para consultar elementos que coincidan con un atributo clave que no sea de partición específico, en lugar de scan(), puedes utilizar el método query() de DynamoDB, que es más eficiente para este escenario. Aquí hay un fragmento de código de ejemplo que puedes utilizar:

    app.get(path, function(req, res) {
      var params = {
        TableName : tableName,
        KeyConditionExpression: 'bookyear = :by',
        ExpressionAttributeValues: {
            ':by': {N: '1997'}
        }
      };
    
      dynamodb.query(params, function(err, data) {
        if (err) {
          res.json({error: 'No se pudieron cargar los elementos: ' + err.message});
        }
    
        res.json({
          data: data.Items.map(function(item) {
            return item;
          }),
        });
      });
    });
    

    Aquí, estamos utilizando el parámetro KeyConditionExpression para especificar el atributo de clave que no es de partición (bookyear) y su valor (1997) que queremos consultar. Ten en cuenta que también necesitamos utilizar el parámetro ExpressionAttributeValues para suministrar el valor en el formato requerido (en este caso, un atributo Number de DynamoDB).

    Con respecto al error que te aparece al devolver los resultados de la consulta, es posible que el objeto data no tenga una propiedad Items si no se encontraron elementos coincidentes en la consulta. Puedes verificar esto y devolver una respuesta apropiada para evitar el “Error interno del servidor”.

Comments are closed.