Amazon DynamoDB
Guía para desarrolladores (Versión de API 2012-08-10)

Paso 3: Crear, leer, actualizar y eliminar elementos

En este paso, se llevan a cabo operaciones de lectura y escritura con un elemento de la tabla Movies.

Para obtener más información sobre cómo leer y escribir datos, consulte Uso de elementos en DynamoDB.

Paso 3.1: Crear un elemento nuevo

En este paso, agregamos un elemento nuevo a la tabla Movies.

  1. Copie el siguiente programa y péguelo en un archivo llamado MoviesItemOps01.js.

    /** * Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * This file is licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. A copy of * the License is located at * * http://aws.amazon.com/apache2.0/ * * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ var AWS = require("aws-sdk"); AWS.config.update({ region: "us-west-2", endpoint: "http://localhost:8000" }); var docClient = new AWS.DynamoDB.DocumentClient(); var table = "Movies"; var year = 2015; var title = "The Big New Movie"; var params = { TableName:table, Item:{ "year": year, "title": title, "info":{ "plot": "Nothing happens at all.", "rating": 0 } } }; console.log("Adding a new item..."); docClient.put(params, function(err, data) { if (err) { console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2)); } else { console.log("Added item:", JSON.stringify(data, null, 2)); } });

    nota

    La clave principal es obligatoria. Este código agrega un elemento que tiene la clave principal (year, title) y atributos info. El atributo info almacena un ejemplo de código JSON que proporciona más información sobre la película.

  2. Para ejecutar el programa, introduzca el siguiente comando:

    node MoviesItemOps01.js

Paso 3.2: Leer un elemento

En el programa anterior, hemos agregado el elemento siguiente a la tabla.

{ year: 2015, title: "The Big New Movie", info: { plot: "Nothing happens at all.", rating: 0 } }

Puede utilizar el método get para leer el elemento en la tabla Movies. Debe especificar los valores de clave principal para poder leer cualquier elemento de Movies si conoce los valores de year y title.

  1. Copie el siguiente programa y péguelo en un archivo llamado MoviesItemOps02.js.

    /** * Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * This file is licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. A copy of * the License is located at * * http://aws.amazon.com/apache2.0/ * * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ var AWS = require("aws-sdk"); AWS.config.update({ region: "us-west-2", endpoint: "http://localhost:8000" }); var docClient = new AWS.DynamoDB.DocumentClient(); var table = "Movies"; var year = 2015; var title = "The Big New Movie"; var params = { TableName: table, Key:{ "year": year, "title": title } }; docClient.get(params, function(err, data) { if (err) { console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2)); } else { console.log("GetItem succeeded:", JSON.stringify(data, null, 2)); } });
  2. Para ejecutar el programa, introduzca el siguiente comando.

    node MoviesItemOps02.js

Paso 3.3: Actualizar un elemento

Puede utilizar el método update para modificar un elemento existente. Puede actualizar los valores de los atributos existentes, así como agregar atributos nuevos o eliminarlos.

En este ejemplo, se llevan a cabo las siguientes actualizaciones:

  • Cambie el valor de los atributos existentes (rating, plot).

  • Agregue un nuevo atributo de lista (actors) al mapa info existente.

A continuación se muestra el elemento existente.

{ year: 2015, title: "The Big New Movie", info: { plot: "Nothing happens at all.", rating: 0 } }

El elemento se actualiza como se indica a continuación.

{ year: 2015, title: "The Big New Movie", info: { plot: "Everything happens all at once.", rating: 5.5, actors: ["Larry", "Moe", "Curly"] } }
  1. Copie el siguiente programa y péguelo en un archivo llamado MoviesItemOps03.js.

    /** * Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * This file is licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. A copy of * the License is located at * * http://aws.amazon.com/apache2.0/ * * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ var AWS = require("aws-sdk"); AWS.config.update({ region: "us-west-2", endpoint: "http://localhost:8000" }); var docClient = new AWS.DynamoDB.DocumentClient() var table = "Movies"; var year = 2015; var title = "The Big New Movie"; // Update the item, unconditionally, var params = { TableName:table, Key:{ "year": year, "title": title }, UpdateExpression: "set info.rating = :r, info.plot=:p, info.actors=:a", ExpressionAttributeValues:{ ":r":5.5, ":p":"Everything happens all at once.", ":a":["Larry", "Moe", "Curly"] }, ReturnValues:"UPDATED_NEW" }; console.log("Updating the item..."); docClient.update(params, function(err, data) { if (err) { console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2)); } else { console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2)); } });

    nota

    Este programa utiliza UpdateExpression para describir todas las actualizaciones que desee realizar con el elemento especificado.

    El parámetro ReturnValues indica a DynamoDB que devuelva solamente los atributos actualizados ("UPDATED_NEW").

  2. Para ejecutar el programa, introduzca el siguiente comando.

    node MoviesItemOps03.js

Paso 3.4: Incrementar un contador atómico

DynamoDB admite los contadores atómicos, en los que se utiliza el método update para aumentar o reducir el valor de un atributo existente sin interferir con las demás solicitudes de escritura. Todas las solicitudes de escritura se aplican en el orden en que se reciben.

El programa siguiente muestra cómo aumentar el valor de rating para una película. Cada vez que se ejecuta el programa, incrementa el valor de este atributo en una unidad.

  1. Copie el siguiente programa y péguelo en un archivo llamado MoviesItemOps04.js.

    /** * Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * This file is licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. A copy of * the License is located at * * http://aws.amazon.com/apache2.0/ * * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ var AWS = require("aws-sdk"); AWS.config.update({ region: "us-west-2", endpoint: "http://localhost:8000" }); var docClient = new AWS.DynamoDB.DocumentClient() var table = "Movies"; var year = 2015; var title = "The Big New Movie"; // Increment an atomic counter var params = { TableName:table, Key:{ "year": year, "title": title }, UpdateExpression: "set info.rating = info.rating + :val", ExpressionAttributeValues:{ ":val": 1 }, ReturnValues:"UPDATED_NEW" }; console.log("Updating the item..."); docClient.update(params, function(err, data) { if (err) { console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2)); } else { console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2)); } });
  2. Para ejecutar el programa, introduzca el siguiente comando.

    node MoviesItemOps04.js

Paso 3.5: Actualizar un elemento (condicionalmente)

El programa siguiente muestra cómo usar UpdateItem con una condición. Si la condición se evalúa en true (verdadero), la actualización se lleva a cabo correctamente; de lo contrario, la actualización no se realiza.

En este caso, el elemento se actualiza solamente si hay más de tres actores en la película.

  1. Copie el siguiente programa y péguelo en un archivo llamado MoviesItemOps05.js.

    /** * Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * This file is licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. A copy of * the License is located at * * http://aws.amazon.com/apache2.0/ * * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ var AWS = require("aws-sdk"); AWS.config.update({ region: "us-west-2", endpoint: "http://localhost:8000" }); var docClient = new AWS.DynamoDB.DocumentClient() var table = "Movies"; var year = 2015; var title = "The Big New Movie"; // Conditional update (will fail) var params = { TableName:table, Key:{ "year": year, "title": title }, UpdateExpression: "remove info.actors[0]", ConditionExpression: "size(info.actors) > :num", ExpressionAttributeValues:{ ":num": 3 }, ReturnValues:"UPDATED_NEW" }; console.log("Attempting a conditional update..."); docClient.update(params, function(err, data) { if (err) { console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2)); } else { console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2)); } });
  2. Para ejecutar el programa, introduzca el siguiente comando.

    node MoviesItemOps05.js

    Debe producirse un error en el programa y mostrar el mensaje siguiente.

    The conditional request failed (Error en la solicitud condicional)

    Esto se debe a que la película tiene tres actores, pero la condición busca un valor mayor que tres actores.

  3. Modifique el programa para que ConditionExpression tenga el aspecto siguiente.

    ConditionExpression: "size(info.actors) >= :num",

    Ahora, la condición es mayor o igual que 3 en lugar de mayor que 3.

  4. Ejecute el programa de nuevo. Ahora, la operación updateItem debería realizarse correctamente.

Paso 3.6: Eliminar un elemento

Puede utilizar el método delete para eliminar un elemento especificando su clave principal. También puede incluir una instrucción ConditionExpression para evitar que se elimine el elemento si no se cumple la condición.

En el siguiente ejemplo, se intenta eliminar un elemento de película determinado si su calificación es igual o menor que 5.

  1. Copie el siguiente programa y péguelo en un archivo llamado MoviesItemOps06.js.

    /** * Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * This file is licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. A copy of * the License is located at * * http://aws.amazon.com/apache2.0/ * * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ var AWS = require("aws-sdk"); AWS.config.update({ region: "us-west-2", endpoint: "http://localhost:8000" }); var docClient = new AWS.DynamoDB.DocumentClient(); var table = "Movies"; var year = 2015; var title = "The Big New Movie"; var params = { TableName:table, Key:{ "year": year, "title": title }, ConditionExpression:"info.rating <= :val", ExpressionAttributeValues: { ":val": 5.0 } }; console.log("Attempting a conditional delete..."); docClient.delete(params, function(err, data) { if (err) { console.error("Unable to delete item. Error JSON:", JSON.stringify(err, null, 2)); } else { console.log("DeleteItem succeeded:", JSON.stringify(data, null, 2)); } });
  2. Para ejecutar el programa, introduzca el siguiente comando.

    node MoviesItemOps06.js

    Debe producirse un error en el programa y mostrar el mensaje siguiente.

    The conditional request failed (Error en la solicitud condicional)

    Esto se debe a que la calificación de esta película concreta es mayor que 5.

  3. Modifique el programa para eliminar la condición de params.

    var params = { TableName:table, Key:{ "title":title, "year":year } };
  4. Ejecute el programa de nuevo. Ahora, la eliminación se llevará a cabo correctamente porque se ha eliminado la condición.